Skip to content

Commit

Permalink
Added option for processing environment variables but not setting val…
Browse files Browse the repository at this point in the history
…ues from them. (#9)
  • Loading branch information
wesdean committed Jan 20, 2022
1 parent dfbec0b commit 8bb794a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 1 deletion.
2 changes: 1 addition & 1 deletion flagset.go
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@ func (f *FlagSetFiller) processField(flagSet *flag.FlagSet, fieldRef interface{}
return err
}

if envName != "" {
if !f.options.noSetFromEnv && envName != "" {
if val, exists := os.LookupEnv(envName); exists {
err := flagSet.Lookup(renamed).Value.Set(val)
if err != nil {
Expand Down
28 changes: 28 additions & 0 deletions flagset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -772,6 +772,34 @@ func TestWithEnvOverrideDisable(t *testing.T) {
`, buf.String())
}

func TestNoSetFromEnv(t *testing.T) {
type Config struct {
Host string `usage:"arg only"`
}

var config Config

assert.NoError(t, os.Setenv("APP_HOST", "host from env"))

filler := flagsfiller.New(
flagsfiller.WithEnv("App"),
flagsfiller.NoSetFromEnv(),
)

var flagset flag.FlagSet
err := filler.Fill(&flagset, &config)
require.NoError(t, err)

buf := grabUsage(flagset)

assert.Empty(t, config.Host)

assert.Equal(t, `
-host string
arg only (env APP_HOST)
`, buf.String())
}

func TestFlagNameOverride(t *testing.T) {
type Config struct {
Host string `flag:"server_address" usage:"address of server"`
Expand Down
10 changes: 10 additions & 0 deletions options.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ type FillerOption func(opt *fillerOptions)
type fillerOptions struct {
fieldRenamer []Renamer
envRenamer []Renamer
noSetFromEnv bool
}

// WithFieldRenamer declares an option to customize the Renamer used to convert field names
Expand All @@ -41,6 +42,15 @@ func WithEnvRenamer(renamer Renamer) FillerOption {
}
}

// NoSetFromEnv ignores setting values from the environment.
// All environment variable renamers are run but values are not set from the environment.
// This is good to use if you need to build a flag set with default values that don't consider the current environment.
func NoSetFromEnv() FillerOption {
return func(opt *fillerOptions) {
opt.noSetFromEnv = true
}
}

func (o *fillerOptions) renameLongName(name string) string {
if len(o.fieldRenamer) == 0 {
return DefaultFieldRenamer(name)
Expand Down

0 comments on commit 8bb794a

Please sign in to comment.