83 lines
2.4 KiB
Go
83 lines
2.4 KiB
Go
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)
|
|
}
|