diff --git a/env.go b/env.go deleted file mode 100644 index aeee8d3..0000000 --- a/env.go +++ /dev/null @@ -1,21 +0,0 @@ -package kong - -import ( - "os" -) - -// EnvarResolver resolves values from environment variables. -// -// It is installed by default. Use ClearResolvers() to disable this. -func EnvarResolver() Resolver { - return ResolverFunc(func(context *Context, parent *Path, flag *Flag) (interface{}, error) { - if flag.Tag.Env == "" { - return nil, nil - } - envar := os.Getenv(flag.Tag.Env) - if envar != "" { - return envar, nil - } - return nil, nil - }) -} diff --git a/kong.go b/kong.go index 017cf50..3a61567 100644 --- a/kong.go +++ b/kong.go @@ -71,7 +71,6 @@ func New(grammar interface{}, options ...Option) (*Kong, error) { vars: Vars{}, bindings: bindings{}, helpFormatter: DefaultHelpValueFormatter, - resolvers: []Resolver{EnvarResolver()}, } options = append(options, Bind(k)) diff --git a/kong_test.go b/kong_test.go index 557894d..40731c3 100644 --- a/kong_test.go +++ b/kong_test.go @@ -675,19 +675,6 @@ func TestHooksCalledForDefault(t *testing.T) { require.Equal(t, []string{"before:default", "after:default"}, ctx.values) } -func TestHooksCalledForEnv(t *testing.T) { - var cli struct { - Flag hookValue `env:"FLAG"` - } - defer tempEnv(envMap{"FLAG": "flagged"})() - - ctx := &hookContext{} - _, err := mustNew(t, &cli, kong.Bind(ctx)).Parse(nil) - require.NoError(t, err) - require.Equal(t, "flagged", string(cli.Flag)) - require.Equal(t, []string{"before:", "after:flagged"}, ctx.values) -} - func TestEnum(t *testing.T) { var cli struct { Flag string `enum:"a,b,c"` diff --git a/model.go b/model.go index c98625c..8023dce 100644 --- a/model.go +++ b/model.go @@ -3,6 +3,7 @@ package kong import ( "fmt" "math" + "os" "reflect" "strconv" "strings" @@ -325,6 +326,16 @@ func (v *Value) ApplyDefault() error { // Does not include resolvers. func (v *Value) Reset() error { v.Target.Set(reflect.Zero(v.Target.Type())) + if v.Tag.Env != "" { + envar := os.Getenv(v.Tag.Env) + if envar != "" { + err := v.Parse(ScanFromTokens(Token{Type: FlagValueToken, Value: envar}), v.Target) + if err != nil { + return fmt.Errorf("%s (from envar %s=%q)", err, v.Tag.Env, envar) + } + return nil + } + } if v.Default != "" { return v.Parse(ScanFromTokens(Token{Type: FlagValueToken, Value: v.Default}), v.Target) }