edit.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package cli
  2. import (
  3. "fmt"
  4. "github.com/spf13/cobra"
  5. "github.com/kotoyuuko/cc-switch-cli/internal/config"
  6. )
  7. func newEditCmd(app *appState) *cobra.Command {
  8. var (
  9. envFlags []string
  10. removeEnv []string
  11. setDescription string
  12. clearDesc bool
  13. )
  14. cmd := &cobra.Command{
  15. Use: "edit <name>",
  16. Short: "Modify an existing provider's env or description",
  17. Args: cobra.ExactArgs(1),
  18. RunE: func(cmd *cobra.Command, args []string) error {
  19. return runEdit(app, args[0], envFlags, removeEnv, setDescription, clearDesc, cmd.Flags().Changed("description"))
  20. },
  21. }
  22. cmd.Flags().StringArrayVar(&envFlags, "env", nil,
  23. "KEY=VALUE to add or overwrite (repeatable)")
  24. cmd.Flags().StringArrayVar(&removeEnv, "remove-env", nil,
  25. "env key to delete (repeatable)")
  26. cmd.Flags().StringVar(&setDescription, "description", "",
  27. "set description; pass empty string to clear")
  28. cmd.Flags().BoolVar(&clearDesc, "clear-description", false,
  29. "alias for --description ''")
  30. return cmd
  31. }
  32. func runEdit(app *appState, name string, envFlags, removeEnv []string, newDesc string, clearDesc bool, descChanged bool) error {
  33. if err := config.ValidateProviderName(name); err != nil {
  34. return err
  35. }
  36. p, ok := app.cfg.Providers[name]
  37. if !ok {
  38. return fmt.Errorf("provider %q does not exist", name)
  39. }
  40. // Mutate a copy so we don't leave a partial change on validation error.
  41. env := make(map[string]string, len(p.Env))
  42. for k, v := range p.Env {
  43. env[k] = v
  44. }
  45. adds, err := parseEnvFlags(envFlags)
  46. if err != nil {
  47. return err
  48. }
  49. for k, v := range adds {
  50. env[k] = v
  51. }
  52. for _, k := range removeEnv {
  53. delete(env, k)
  54. }
  55. if len(env) == 0 {
  56. return fmt.Errorf("provider %q would have zero env keys after edit", name)
  57. }
  58. updated := config.Provider{Description: p.Description, Env: env}
  59. if clearDesc {
  60. updated.Description = ""
  61. } else if descChanged {
  62. updated.Description = newDesc
  63. }
  64. if err := app.cfg.UpdateProvider(name, updated); err != nil {
  65. return err
  66. }
  67. if err := app.save(); err != nil {
  68. return err
  69. }
  70. fmt.Fprintf(app.stdout, "updated provider %q\n", name)
  71. return nil
  72. }