From cb135b7caafd7173b2a3fe40eb00e74575b587d3 Mon Sep 17 00:00:00 2001 From: lew Date: Mon, 16 Mar 2026 16:27:37 +0000 Subject: [PATCH] feat(completions): add key and store completion helpers --- cmd/completions.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 cmd/completions.go diff --git a/cmd/completions.go b/cmd/completions.go new file mode 100644 index 0000000..0f8b856 --- /dev/null +++ b/cmd/completions.go @@ -0,0 +1,83 @@ +package cmd + +import ( + "strings" + + "github.com/spf13/cobra" +) + +// completeKeys returns key[@store] completions for the current toComplete prefix. +// It handles three cases: +// - No "@" typed yet: return all keys from all stores (as "key@store") +// - "@" typed with partial store: return store-scoped completions +// - "key@store" with known store: return keys from that store +func completeKeys(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + store := &Store{} + stores, err := store.AllStores() + if err != nil || len(stores) == 0 { + return nil, cobra.ShellCompDirectiveNoFileComp + } + + var completions []string + parts := strings.SplitN(toComplete, "@", 2) + + if len(parts) == 2 { + // User typed "something@" — complete keys within matching stores. + prefix := parts[0] + dbFilter := strings.ToLower(parts[1]) + for _, db := range stores { + if !strings.HasPrefix(db, dbFilter) { + continue + } + keys, err := store.Keys(db) + if err != nil { + continue + } + for _, k := range keys { + if prefix == "" || strings.HasPrefix(k, strings.ToLower(prefix)) { + completions = append(completions, k+"@"+db) + } + } + } + } else { + // No "@" yet — offer key@store for every key in every store. + lowerPrefix := strings.ToLower(toComplete) + for _, db := range stores { + keys, err := store.Keys(db) + if err != nil { + continue + } + for _, k := range keys { + full := k + "@" + db + if strings.HasPrefix(full, lowerPrefix) || strings.HasPrefix(k, lowerPrefix) { + completions = append(completions, full) + } + } + } + } + + return completions, cobra.ShellCompDirectiveNoFileComp +} + +// completeStores returns store name completions. +func completeStores(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + store := &Store{} + stores, err := store.AllStores() + if err != nil { + return nil, cobra.ShellCompDirectiveNoFileComp + } + + var completions []string + lowerPrefix := strings.ToLower(toComplete) + for _, db := range stores { + if strings.HasPrefix(db, lowerPrefix) { + completions = append(completions, db) + } + } + return completions, cobra.ShellCompDirectiveNoFileComp +} + +// completeStoreFlag is a completion function for --store / -s string slice flags. +func completeStoreFlag(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return completeStores(cmd, args, toComplete) +}