posh/pkg/command/cache.go
Kevin Franklin Kim 3a81a2482f
feat: use sync map
2025-04-04 16:32:53 +02:00

139 lines
3.6 KiB
Go

package command
import (
"context"
"fmt"
"sort"
"github.com/foomo/posh/pkg/cache"
"github.com/foomo/posh/pkg/command/tree"
"github.com/foomo/posh/pkg/log"
"github.com/foomo/posh/pkg/prompt/goprompt"
"github.com/foomo/posh/pkg/readline"
"github.com/foomo/posh/pkg/util/suggests"
"github.com/pterm/pterm"
"github.com/pterm/pterm/putils"
"github.com/samber/lo"
)
type Cache struct {
l log.Logger
tree tree.Root
cache cache.Cache
}
// ------------------------------------------------------------------------------------------------
// ~ Constructor
// ------------------------------------------------------------------------------------------------
func NewCache(l log.Logger, cache cache.Cache) *Cache {
inst := &Cache{
l: l,
cache: cache,
}
inst.tree = tree.New(&tree.Node{
Name: "cache",
Description: "Manage the internal cache",
Nodes: tree.Nodes{
{
Name: "clear",
Description: "Clear caches",
Args: tree.Args{
{
Name: "Namespace",
Description: "Name of namespace to clear.",
Repeat: true,
Optional: true,
Suggest: func(ctx context.Context, t tree.Root, r *readline.Readline) []goprompt.Suggest {
return suggests.List(lo.Keys(inst.cache.List()))
},
},
},
Execute: inst.clear,
},
{
Name: "list",
Description: "List all caches",
Execute: inst.list,
},
},
})
return inst
}
// ------------------------------------------------------------------------------------------------
// ~ Public methods
// ------------------------------------------------------------------------------------------------
func (c *Cache) Name() string {
return c.tree.Node().Name
}
func (c *Cache) Description() string {
return c.tree.Node().Description
}
func (c *Cache) Complete(ctx context.Context, r *readline.Readline) []goprompt.Suggest {
return c.tree.Complete(ctx, r)
}
func (c *Cache) Execute(ctx context.Context, r *readline.Readline) error {
return c.tree.Execute(ctx, r)
}
func (c *Cache) Help(ctx context.Context, r *readline.Readline) string {
return `Manage the internal cache.
Usage:
cache [command]
Available commands:
list List all caches
clear Clear all caches
`
}
// ------------------------------------------------------------------------------------------------
// ~ Private methods
// ------------------------------------------------------------------------------------------------
func (c *Cache) clear(ctx context.Context, r *readline.Readline) error {
if r.Args().Len() > 1 {
c.l.Info("clearing cache:")
for _, value := range r.Args()[1:] {
c.l.Info("└ " + value)
c.cache.Get(value).Delete("")
}
} else {
c.l.Info("clearing all caches")
c.cache.Clear()
}
return nil
}
func (c *Cache) list(ctx context.Context, r *readline.Readline) error {
// Create a fork of the default table, fill it with data and print it.
// Data can also be generated and inserted later.
list := pterm.LeveledList{}
cacheList := c.cache.List()
cacheListKeys := lo.Keys(cacheList)
sort.Strings(cacheListKeys)
for _, ns := range cacheListKeys {
value := cacheList[ns]
list = append(list, pterm.LeveledListItem{Level: 0, Text: ns})
keys := value.Keys()
sort.Strings(keys)
for _, k := range keys {
list = append(list, pterm.LeveledListItem{Level: 1, Text: k})
if c.l.Level() == log.LevelTrace {
list = append(list, pterm.LeveledListItem{Level: 2, Text: fmt.Sprintf("%v", value.Get(k, nil))})
}
}
}
// Generate tree from LeveledList.
root := putils.TreeFromLeveledList(list)
// Render TreePrinter
return pterm.DefaultTree.WithRoot(root).Render()
}