package cli import ( "fmt" "sort" "github.com/spf13/cobra" "github.com/kotoyuuko/cc-switch-cli/internal/config" "github.com/kotoyuuko/cc-switch-cli/internal/mask" ) func newListCmd(app *appState) *cobra.Command { var verbose bool cmd := &cobra.Command{ Use: "list", Aliases: []string{"ls"}, Short: "List configured providers", RunE: func(cmd *cobra.Command, args []string) error { return runList(app, verbose) }, } cmd.Flags().BoolVarP(&verbose, "verbose", "V", false, "also print env keys with masked values (references shown as-is)") return cmd } func runList(app *appState, verbose bool) error { if len(app.cfg.Providers) == 0 { fmt.Fprintln(app.stdout, "(no providers configured)") return nil } names := app.cfg.SortedProviderNames() for _, name := range names { p := app.cfg.Providers[name] marker := " " if app.cfg.DefaultProvider == name { marker = "*" } line := fmt.Sprintf("%s %s", marker, name) if p.Description != "" { line += " " + p.Description } fmt.Fprintln(app.stdout, line) if verbose { keys := make([]string, 0, len(p.Env)) for k := range p.Env { keys = append(keys, k) } sort.Strings(keys) for _, k := range keys { fmt.Fprintf(app.stdout, " %s=%s\n", k, displayValue(p.Env[k])) } } } return nil } // displayValue returns the string to show the user for an env value. // `env:VAR` references are shown as-is (they are pointers, not secrets); // literal values are masked. func displayValue(v string) string { if _, ok := config.IsEnvRef(v); ok { return v } return mask.Value(v) }