From b15ac8d1f3e009030208cb3888887912c7c125a1 Mon Sep 17 00:00:00 2001 From: ajatprabha Date: Wed, 21 Jun 2023 03:21:32 +0530 Subject: [PATCH] handle global in `flag-prefix` for nested structs --- x/cli/cli.go | 11 ++++++----- x/cli/example_test.go | 3 ++- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/x/cli/cli.go b/x/cli/cli.go index 5c4cf5f..405a809 100644 --- a/x/cli/cli.go +++ b/x/cli/cli.go @@ -53,7 +53,7 @@ func newCLI(pn string, o *options) *CLI { v := viper.New() v.AutomaticEnv() - _ = bindFlags(rc, rc, reflect.ValueOf(o.cfgObj).Elem(), v, "", "", rc.Name()) + _ = bindFlags(rc, rc, reflect.ValueOf(o.cfgObj).Elem(), v, "", "", rc.Name(), false) rc.AddCommand(&cobra.Command{ Use: "generate-config", @@ -98,7 +98,7 @@ func addSubCommandsMap(rc *cobra.Command, v *viper.Viper, o *options, cfg interf } rc.AddCommand(newCmd) - if err := bindFlags(rc, newCmd, reflect.ValueOf(o.cfgObj).Elem(), v, "", "", sc.Name); err != nil { + if err := bindFlags(rc, newCmd, reflect.ValueOf(o.cfgObj).Elem(), v, "", "", sc.Name, false); err != nil { panic(err) } @@ -113,6 +113,7 @@ func bindFlags( val reflect.Value, v *viper.Viper, flagPrefix, envPrefix, cmdName string, + global bool, ) error { typ := val.Type() @@ -123,7 +124,7 @@ func bindFlags( env := envPrefix + field.Tag.Get("env") def := field.Tag.Get("default") usage := field.Tag.Get("flag-usage") - global := len(flagDetails) > 1 && flagDetails[1] == "global" + localGlobal := global || (len(flagDetails) > 1 && flagDetails[1] == "global") subCommands := strings.Split(field.Tag.Get("sub-commands"), ",") bindToSubCommand := len(subCommands) > 1 || (len(subCommands) == 1 && subCommands[0] != "") @@ -134,7 +135,7 @@ func bindFlags( targetCmd := cmd flagFunc := targetCmd.Flags() - if global { + if localGlobal { targetCmd = rootCmd flagFunc = targetCmd.PersistentFlags() } @@ -155,7 +156,7 @@ func bindFlags( nestedEnvPrefix = envPrefix + nestedEnvPrefix } - if err := bindFlags(rootCmd, targetCmd, val.Field(i), v, nestedFlagPrefix, nestedEnvPrefix, cmdName); err != nil { + if err := bindFlags(rootCmd, targetCmd, val.Field(i), v, nestedFlagPrefix, nestedEnvPrefix, cmdName, localGlobal); err != nil { return err } diff --git a/x/cli/example_test.go b/x/cli/example_test.go index 64f8e2a..6f2616f 100644 --- a/x/cli/example_test.go +++ b/x/cli/example_test.go @@ -13,7 +13,8 @@ import ( type Config struct { Debug bool `flag:"debug,global" env:"DEBUG" default:"false" flag-usage:"enable debug mode"` Log struct { - Level string `flag:"level" env:"LEVEL" default:"info"` + Enabled bool `flag:"enabled" env:"ENABLED" default:"true" flag-usage:"enable logging"` + Level string `flag:"level" env:"LEVEL" default:"info"` } `flag-prefix:"log,global" env-prefix:"LOG"` Host string `flag:"host" env:"HOST" default:"localhost" sub-commands:"server"` Port int `flag:"port" env:"PORT" default:"8080" sub-commands:"server"`