package cli import ( "fmt" "github.com/spf13/cobra" "github.com/kotoyuuko/cc-switch-cli/internal/config" ) func newEditCmd(app *appState) *cobra.Command { var ( envFlags []string removeEnv []string setDescription string clearDesc bool ) cmd := &cobra.Command{ Use: "edit ", Short: "Modify an existing provider's env or description", Args: cobra.ExactArgs(1), RunE: func(cmd *cobra.Command, args []string) error { return runEdit(app, args[0], envFlags, removeEnv, setDescription, clearDesc, cmd.Flags().Changed("description")) }, } cmd.Flags().StringArrayVar(&envFlags, "env", nil, "KEY=VALUE to add or overwrite (repeatable)") cmd.Flags().StringArrayVar(&removeEnv, "remove-env", nil, "env key to delete (repeatable)") cmd.Flags().StringVar(&setDescription, "description", "", "set description; pass empty string to clear") cmd.Flags().BoolVar(&clearDesc, "clear-description", false, "alias for --description ''") return cmd } func runEdit(app *appState, name string, envFlags, removeEnv []string, newDesc string, clearDesc bool, descChanged bool) error { if err := config.ValidateProviderName(name); err != nil { return err } p, ok := app.cfg.Providers[name] if !ok { return fmt.Errorf("provider %q does not exist", name) } // Mutate a copy so we don't leave a partial change on validation error. env := make(map[string]string, len(p.Env)) for k, v := range p.Env { env[k] = v } adds, err := parseEnvFlags(envFlags) if err != nil { return err } for k, v := range adds { env[k] = v } for _, k := range removeEnv { delete(env, k) } if len(env) == 0 { return fmt.Errorf("provider %q would have zero env keys after edit", name) } updated := config.Provider{Description: p.Description, Env: env} if clearDesc { updated.Description = "" } else if descChanged { updated.Description = newDesc } if err := app.cfg.UpdateProvider(name, updated); err != nil { return err } if err := app.save(); err != nil { return err } fmt.Fprintf(app.stdout, "updated provider %q\n", name) return nil }