From f0be9c42d395ec71d9e24584bdb6f2d56e581961 Mon Sep 17 00:00:00 2001 From: lew Date: Thu, 18 Dec 2025 18:20:51 +0000 Subject: [PATCH] feat(config): restructures config --- cmd/config.go | 51 ++++++++++++++++++++++++++++++++++---------------- cmd/del-db.go | 30 ++++++++++++++--------------- cmd/del.go | 31 +++++++++++++----------------- cmd/dump.go | 2 +- cmd/keyspec.go | 4 ++-- cmd/list.go | 2 +- cmd/mv.go | 2 +- cmd/restore.go | 2 +- cmd/shared.go | 4 ++-- cmd/version.go | 2 +- 10 files changed, 71 insertions(+), 59 deletions(-) diff --git a/cmd/config.go b/cmd/config.go index ba15ea7..be93144 100644 --- a/cmd/config.go +++ b/cmd/config.go @@ -32,10 +32,19 @@ import ( ) type Config struct { - DefaultDB string `toml:"default_db"` - DisplayArt bool `toml:"display_art"` - WarnOnDelete bool `toml:"warn_on_delete"` - WarnOnOverwrite bool `toml:"warn_on_overwrite"` + DisplayAsciiArt bool `toml:"display_ascii_art"` + Key KeyConfig `toml:"key"` + Store StoreConfig `toml:"store"` +} + +type KeyConfig struct { + AlwaysPromptDelete bool `toml:"always_prompt_delete"` + AlwaysPromptOverwrite bool `toml:"always_prompt_overwrite"` +} + +type StoreConfig struct { + DefaultStoreName string `toml:"default_store_name"` + AlwaysPromptDelete bool `toml:"always_prompt_delete"` } var ( @@ -58,10 +67,15 @@ func init() { func defaultConfig() Config { return Config{ - DefaultDB: "default", - DisplayArt: false, - WarnOnOverwrite: true, - WarnOnDelete: true, + DisplayAsciiArt: true, + Key: KeyConfig{ + AlwaysPromptDelete: false, + AlwaysPromptOverwrite: false, + }, + Store: StoreConfig{ + DefaultStoreName: "default", + AlwaysPromptDelete: true, + }, } } @@ -85,20 +99,25 @@ func loadConfig() (Config, error) { return cfg, fmt.Errorf("parse %s: %w", path, err) } - if !md.IsDefined("default_db") || cfg.DefaultDB == "" { - cfg.DefaultDB = defaultConfig().DefaultDB + if !md.IsDefined("display_ascii_art") { + cfg.DisplayAsciiArt = defaultConfig().DisplayAsciiArt + } - if !md.IsDefined("display_art") { - cfg.DisplayArt = defaultConfig().DisplayArt + if !md.IsDefined("key", "always_prompt_delete") { + cfg.Key.AlwaysPromptDelete = defaultConfig().Key.AlwaysPromptDelete } - if !md.IsDefined("warn_on_delete") { - cfg.WarnOnDelete = defaultConfig().WarnOnDelete + if !md.IsDefined("store", "default_store_name") || cfg.Store.DefaultStoreName == "" { + cfg.Store.DefaultStoreName = defaultConfig().Store.DefaultStoreName + + } + if !md.IsDefined("store", "always_prompt_delete") { + cfg.Store.AlwaysPromptDelete = defaultConfig().Store.AlwaysPromptDelete } - if !md.IsDefined("warn_on_overwrite") { - cfg.WarnOnOverwrite = defaultConfig().WarnOnOverwrite + if !md.IsDefined("key", "always_prompt_overwrite") { + cfg.Key.AlwaysPromptOverwrite = defaultConfig().Key.AlwaysPromptOverwrite } return cfg, nil diff --git a/cmd/del-db.go b/cmd/del-db.go index 37c3adc..2d6805c 100644 --- a/cmd/del-db.go +++ b/cmd/del-db.go @@ -25,10 +25,10 @@ package cmd import ( "errors" "fmt" + "os" "strings" "github.com/spf13/cobra" - "os" ) // delDbCmd represents the set command @@ -52,26 +52,24 @@ func delDb(cmd *cobra.Command, args []string) error { return fmt.Errorf("cannot delete-db '%s': %v", args[0], err) } - force, err := cmd.Flags().GetBool("force") + interactive, err := cmd.Flags().GetBool("interactive") if err != nil { return fmt.Errorf("cannot delete-db '%s': %v", args[0], err) } - if force { - return executeDeletion(path) - } + if interactive || config.Store.AlwaysPromptDelete { + message := fmt.Sprintf("delete-db '%s': are you sure? (y/n)", args[0]) + fmt.Println(message) - message := fmt.Sprintf("delete-db '%s': are you sure? (y/n)", args[0]) - fmt.Println(message) - - var confirm string - if _, err := fmt.Scanln(&confirm); err != nil { - return fmt.Errorf("cannot delete-db '%s': %v", args[0], err) + var confirm string + if _, err := fmt.Scanln(&confirm); err != nil { + return fmt.Errorf("cannot delete-db '%s': %v", args[0], err) + } + if strings.ToLower(confirm) != "y" { + return nil + } } - if strings.ToLower(confirm) == "y" { - return executeDeletion(path) - } - return nil + return executeDeletion(path) } func executeDeletion(path string) error { @@ -82,6 +80,6 @@ func executeDeletion(path string) error { } func init() { - delDbCmd.Flags().BoolP("force", "f", false, "Force delete without confirmation") + delDbCmd.Flags().BoolP("interactive", "i", false, "Prompt yes/no for each deletion") rootCmd.AddCommand(delDbCmd) } diff --git a/cmd/del.go b/cmd/del.go index 1e48d7f..ba133b4 100644 --- a/cmd/del.go +++ b/cmd/del.go @@ -45,7 +45,7 @@ var delCmd = &cobra.Command{ func del(cmd *cobra.Command, args []string) error { store := &Store{} - force, err := cmd.Flags().GetBool("force") + interactive, err := cmd.Flags().GetBool("interactive") if err != nil { return err } @@ -71,23 +71,18 @@ func del(cmd *cobra.Command, args []string) error { return fmt.Errorf("cannot remove: No such key") } - if !force && config.WarnOnDelete { - var confirm string - quotedTargets := make([]string, 0, len(targets)) - for _, target := range targets { - quotedTargets = append(quotedTargets, fmt.Sprintf("%q", target.display)) - } - message := fmt.Sprintf("remove %s: are you sure? (y/n)", strings.Join(quotedTargets, ", ")) - fmt.Println(message) - if _, err := fmt.Scanln(&confirm); err != nil { - return fmt.Errorf("cannot remove '%s': %v", args[0], err) - } - if strings.ToLower(confirm) != "y" { - return nil - } - } - for _, target := range targets { + if interactive || config.Key.AlwaysPromptDelete { + var confirm string + message := fmt.Sprintf("remove %q: are you sure? (y/n)", target.display) + fmt.Println(message) + if _, err := fmt.Scanln(&confirm); err != nil { + return fmt.Errorf("cannot remove '%s': %v", target.full, err) + } + if strings.ToLower(confirm) != "y" { + continue + } + } trans := TransactionArgs{ key: target.full, readonly: false, @@ -112,7 +107,7 @@ func del(cmd *cobra.Command, args []string) error { } func init() { - delCmd.Flags().BoolP("force", "f", false, "Force delete without confirmation") + delCmd.Flags().BoolP("interactive", "i", false, "Prompt yes/no for each deletion") delCmd.Flags().StringSliceP("glob", "g", nil, "Delete keys matching glob pattern (repeatable)") delCmd.Flags().String("glob-sep", "", fmt.Sprintf("Characters treated as separators for globbing (default %q)", defaultGlobSeparatorsDisplay())) rootCmd.AddCommand(delCmd) diff --git a/cmd/dump.go b/cmd/dump.go index 10e3667..781d3bc 100644 --- a/cmd/dump.go +++ b/cmd/dump.go @@ -52,7 +52,7 @@ var dumpCmd = &cobra.Command{ func dump(cmd *cobra.Command, args []string) error { store := &Store{} - targetDB := "@" + config.DefaultDB + targetDB := "@" + config.Store.DefaultStoreName if len(args) == 1 { rawArg := args[0] dbName, err := store.parseDB(rawArg, false) diff --git a/cmd/keyspec.go b/cmd/keyspec.go index 2c8b707..ce4c4ec 100644 --- a/cmd/keyspec.go +++ b/cmd/keyspec.go @@ -59,7 +59,7 @@ func ParseKey(raw string, defaults bool) (KeySpec, error) { key := strings.ToLower(rawKey) db := strings.ToLower(rawDB) if db == "" && defaults { - db = config.DefaultDB + db = config.Store.DefaultStoreName } return KeySpec{ @@ -82,7 +82,7 @@ func (k KeySpec) Full() string { // Display returns the normalized key reference // but omits the default database if none was set manually func (k KeySpec) Display() string { - if k.DB == "" || k.DB == config.DefaultDB { + if k.DB == "" || k.DB == config.Store.DefaultStoreName { return k.Key } return fmt.Sprintf("%s@%s", k.Key, k.DB) diff --git a/cmd/list.go b/cmd/list.go index 5402888..69fc6c9 100644 --- a/cmd/list.go +++ b/cmd/list.go @@ -42,7 +42,7 @@ var listCmd = &cobra.Command{ func list(cmd *cobra.Command, args []string) error { store := &Store{} - targetDB := "@" + config.DefaultDB + targetDB := "@" + config.Store.DefaultStoreName if len(args) == 1 { rawArg := args[0] dbName, err := store.parseDB(rawArg, false) diff --git a/cmd/mv.go b/cmd/mv.go index 5756c95..5d9c825 100644 --- a/cmd/mv.go +++ b/cmd/mv.go @@ -92,7 +92,7 @@ func mv(cmd *cobra.Command, args []string) error { readonly: false, sync: false, transact: func(tx *badger.Txn, k []byte) error { - if !force && config.WarnOnOverwrite { + if !force && config.Key.AlwaysPromptOverwrite { if _, err := tx.Get(k); err == nil { return fmt.Errorf("cannot move '%s': '%s' already exists > run with --force to overwrite", fromSpec.Key, toSpec.Key) } else if err != badger.ErrKeyNotFound { diff --git a/cmd/restore.go b/cmd/restore.go index 57cd500..9b000f5 100644 --- a/cmd/restore.go +++ b/cmd/restore.go @@ -46,7 +46,7 @@ var restoreCmd = &cobra.Command{ func restore(cmd *cobra.Command, args []string) error { store := &Store{} - dbName := config.DefaultDB + dbName := config.Store.DefaultStoreName if len(args) == 1 { parsed, err := store.parseDB(args[0], false) if err != nil { diff --git a/cmd/shared.go b/cmd/shared.go index d3b622d..9e8b102 100644 --- a/cmd/shared.go +++ b/cmd/shared.go @@ -174,7 +174,7 @@ func (s *Store) parseDB(v string, defaults bool) (string, error) { } if db == "" { if defaults { - return config.DefaultDB, nil + return config.Store.DefaultStoreName, nil } return "", fmt.Errorf("cannot parse db: bad db format, use DB or @DB") } @@ -186,7 +186,7 @@ func (s *Store) parseDB(v string, defaults bool) (string, error) { func (s *Store) open(name string) (*badger.DB, error) { if name == "" { - name = config.DefaultDB + name = config.Store.DefaultStoreName } path, err := s.path(name) if err != nil { diff --git a/cmd/version.go b/cmd/version.go index 1e213d2..a43a5f3 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -36,7 +36,7 @@ var versionCmd = &cobra.Command{ Use: "version", Short: "Display pda! version", Run: func(cmd *cobra.Command, args []string) { - if config.DisplayArt { + if config.DisplayAsciiArt { fmt.Print(asciiArt + "\n ") } fmt.Printf("%s\n", version)