list.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package cli
  2. import (
  3. "fmt"
  4. "sort"
  5. "github.com/spf13/cobra"
  6. "github.com/kotoyuuko/cc-switch-cli/internal/config"
  7. "github.com/kotoyuuko/cc-switch-cli/internal/mask"
  8. )
  9. func newListCmd(app *appState) *cobra.Command {
  10. var verbose bool
  11. cmd := &cobra.Command{
  12. Use: "list",
  13. Aliases: []string{"ls"},
  14. Short: "List configured providers",
  15. RunE: func(cmd *cobra.Command, args []string) error {
  16. return runList(app, verbose)
  17. },
  18. }
  19. cmd.Flags().BoolVarP(&verbose, "verbose", "V", false,
  20. "also print env keys with masked values (references shown as-is)")
  21. return cmd
  22. }
  23. func runList(app *appState, verbose bool) error {
  24. if len(app.cfg.Providers) == 0 {
  25. fmt.Fprintln(app.stdout, "(no providers configured)")
  26. return nil
  27. }
  28. names := app.cfg.SortedProviderNames()
  29. for _, name := range names {
  30. p := app.cfg.Providers[name]
  31. marker := " "
  32. if app.cfg.DefaultProvider == name {
  33. marker = "*"
  34. }
  35. line := fmt.Sprintf("%s %s", marker, name)
  36. if p.Description != "" {
  37. line += " " + p.Description
  38. }
  39. fmt.Fprintln(app.stdout, line)
  40. if verbose {
  41. keys := make([]string, 0, len(p.Env))
  42. for k := range p.Env {
  43. keys = append(keys, k)
  44. }
  45. sort.Strings(keys)
  46. for _, k := range keys {
  47. fmt.Fprintf(app.stdout, " %s=%s\n", k, displayValue(p.Env[k]))
  48. }
  49. }
  50. }
  51. return nil
  52. }
  53. // displayValue returns the string to show the user for an env value.
  54. // `env:VAR` references are shown as-is (they are pointers, not secrets);
  55. // literal values are masked.
  56. func displayValue(v string) string {
  57. if _, ok := config.IsEnvRef(v); ok {
  58. return v
  59. }
  60. return mask.Value(v)
  61. }