package cli import ( "context" "fmt" "os" "github.com/urfave/cli/v3" ) func readCommand() *cli.Command { return &cli.Command{ Name: "read", Usage: "read a secret (e.g. `vault-tui read secret/team/prod/db`)", ArgsUsage: "", Flags: []cli.Flag{ &cli.BoolFlag{Name: "json"}, &cli.IntFlag{Name: "version", Usage: "KV v2 version to read (default: latest)"}, &cli.StringFlag{Name: "field", Usage: "print only this field's raw value"}, }, Action: func(ctx context.Context, cmd *cli.Command) error { a, err := appFrom(ctx) if err != nil { return err } if cmd.Args().Len() == 0 { return fmt.Errorf("usage: vault-tui read ") } if _, err := a.EnsureLoggedIn(ctx, cmd.String("token")); err != nil { return err } svc := a.Service() mount, rel, err := splitMountPath(ctx, svc, cmd.Args().First()) if err != nil { return err } sec, err := svc.KV.Read(ctx, mount, rel, int(cmd.Int("version"))) if err != nil { return err } if sec == nil { return fmt.Errorf("no secret found at %s", cmd.Args().First()) } if field := cmd.String("field"); field != "" { v, ok := sec.Data[field] if !ok { return fmt.Errorf("field %q not present", field) } fmt.Println(v) return nil } if cmd.Bool("json") { return printJSON(os.Stdout, sec) } out := map[string]string{} for k, v := range sec.Data { out[k] = fmt.Sprint(v) } printKV(os.Stdout, out) if sec.Version > 0 { fmt.Printf("\nversion: %d\n", sec.Version) } return nil }, } }