diff --git a/context.go b/context.go index 4861f00..c63b1ab 100644 --- a/context.go +++ b/context.go @@ -135,7 +135,7 @@ func (c *Context) Validate() error { err := Visit(c.Model, func(node Visitable, next Next) error { if value, ok := node.(*Value); ok { if value.Enum != "" && !value.EnumMap()[fmt.Sprintf("%v", value.Target.Interface())] { - return fmt.Errorf("%s must be one of %s but got %q", value.Summary(), value.Enum, value.Target.Interface()) + return fmt.Errorf("%s must be one of %s but got %q", value.ShortSummary(), value.Enum, value.Target.Interface()) } } return next(nil) diff --git a/defaults.go b/defaults.go index a4a314e..f6728d7 100644 --- a/defaults.go +++ b/defaults.go @@ -14,9 +14,8 @@ func ApplyDefaults(target interface{}, options ...Option) error { if err != nil { return err } - err = ctx.Validate() - if err != nil { + if err = ctx.ApplyDefaults(); err != nil { return err } - return ctx.ApplyDefaults() + return ctx.Validate() } diff --git a/kong.go b/kong.go index 197b187..713c337 100644 --- a/kong.go +++ b/kong.go @@ -209,10 +209,10 @@ func (k *Kong) Parse(args []string) (ctx *Context, err error) { if err = k.applyHook(ctx, "BeforeApply"); err != nil { return nil, &ParseError{error: err, Context: ctx} } - if err = ctx.Validate(); err != nil { + if _, err = ctx.Apply(); err != nil { return nil, &ParseError{error: err, Context: ctx} } - if _, err = ctx.Apply(); err != nil { + if err = ctx.Validate(); err != nil { return nil, &ParseError{error: err, Context: ctx} } if err = k.applyHook(ctx, "AfterApply"); err != nil { diff --git a/kong_test.go b/kong_test.go index e6c3858..11c3171 100644 --- a/kong_test.go +++ b/kong_test.go @@ -680,7 +680,7 @@ func TestEnum(t *testing.T) { Flag string `enum:"a,b,c"` } _, err := mustNew(t, &cli).Parse([]string{"--flag", "d"}) - require.EqualError(t, err, "--flag=STRING must be one of a,b,c but got \"\"") + require.EqualError(t, err, "--flag must be one of a,b,c but got \"d\"") } type commandWithHook struct { @@ -734,5 +734,18 @@ func TestDefaultEnumValidated(t *testing.T) { } p := mustNew(t, &cli) _, err := p.Parse(nil) - require.Error(t, err) + require.EqualError(t, err, "--flag must be one of valid but got \"invalid\"") +} + +func TestEnvarEnumValidated(t *testing.T) { + restore := tempEnv(map[string]string{ + "FLAG": "invalid", + }) + defer restore() + var cli struct { + Flag string `env:"FLAG" enum:"valid" default:"valid"` + } + p := mustNew(t, &cli) + _, err := p.Parse(nil) + require.EqualError(t, err, "--flag must be one of valid but got \"invalid\"") }