diff --git a/go.mod b/go.mod index 64f7643..2ed7ac3 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,7 @@ require ( github.com/muesli/mango-cobra v1.2.0 github.com/muesli/roff v0.1.0 github.com/openbao/openbao/api/v2 v2.1.0 + github.com/samber/lo v1.49.1 github.com/spf13/cobra v1.8.1 github.com/spf13/viper v1.19.0 github.com/stretchr/testify v1.10.0 diff --git a/go.sum b/go.sum index 3d72c46..23003bb 100644 --- a/go.sum +++ b/go.sum @@ -107,6 +107,8 @@ github.com/muesli/roff v0.1.0 h1:YD0lalCotmYuF5HhZliKWlIx7IEhiXeSfq7hNjFqGF8= github.com/muesli/roff v0.1.0/go.mod h1:pjAHQM9hdUUwm/krAfrLGgJkXJ+YuhtsfZ42kieB2Ig= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg= github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/openbao/openbao/api/v2 v2.1.0 h1:x1I03dGuFfXGofO7Ix8bJ991c6A/cXBV+5bQbBv1UyQ= github.com/openbao/openbao/api/v2 v2.1.0/go.mod h1:fit0FZr/2diblykkbid4vh0MkT3Iwkhza5IindPKJ70= github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= @@ -126,6 +128,8 @@ github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsF github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= @@ -202,8 +206,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 24d708e..c88d1e4 100644 --- a/main.go +++ b/main.go @@ -31,6 +31,7 @@ var rootCmd = &cobra.Command{ var rootFlags struct { engine string path string + fields []string } func must(err error) { @@ -42,6 +43,7 @@ func must(err error) { func init() { rootCmd.Flags().StringVarP(&rootFlags.engine, "engine", "e", "", "secret engine to use") rootCmd.Flags().StringVarP(&rootFlags.path, "path", "p", "", "secret path") + rootCmd.Flags().StringSliceVarP(&rootFlags.fields, "fields", "f", nil, "fields to display") must(viper.BindPFlags(rootCmd.Flags())) rootCmd.AddCommand(versionCmd, manCmd) @@ -74,7 +76,7 @@ func root(_ *cobra.Command, _ []string) { path.Add(strings.Split(p, "/")...) } - m := newModel(client, path) + m := newModel(client, path, rootFlags.fields) if _, err := tea.NewProgram(m).Run(); err != nil { log.Fatal("Error", "err", err) } diff --git a/tui.go b/tui.go index 76964c4..4532535 100644 --- a/tui.go +++ b/tui.go @@ -12,6 +12,7 @@ import ( "github.com/charmbracelet/huh/spinner" "github.com/charmbracelet/lipgloss" "github.com/openbao/openbao/api/v2" + "github.com/samber/lo" ) const MAXHEIGHT = 20 @@ -47,15 +48,17 @@ type model struct { huhSelect *huh.Select[string] options []string path vaultPath + fields []string client *api.Client secrets []vaultSecret } -func newModel(client *api.Client, path vaultPath) model { +func newModel(client *api.Client, path vaultPath, fields []string) model { return model{ state: stateLoading, client: client, path: path, + fields: fields, spinner: spinner.New().Title("Fetching secrets..."), form: huh.NewForm(), } @@ -216,12 +219,18 @@ func (m model) View() string { case stateAbort: return "" case stateDone: - var s strings.Builder - s.WriteString(fmt.Sprintf("Path: %s\n", m.path.String())) - for _, secret := range m.secrets { + return m.printSecrets() + } + return "uwu" +} + +func (m model) printSecrets() string { + var s strings.Builder + s.WriteString(fmt.Sprintf("Path: %s\n", m.path.String())) + for _, secret := range m.secrets { + if len(m.fields) == 0 || lo.Contains(m.fields, secret.key) { s.WriteString(fmt.Sprintf("%s: %v\n", secret.key, secret.value)) } - return s.String() } - return "uwu" + return s.String() }