Validate after everything is applied.

Fixes #27.
This commit is contained in:
Alec Thomas
2019-06-21 12:09:04 +10:00
parent 95de7d2f0d
commit 102a975844
4 changed files with 20 additions and 8 deletions
+1 -1
View File
@@ -135,7 +135,7 @@ func (c *Context) Validate() error {
err := Visit(c.Model, func(node Visitable, next Next) error { err := Visit(c.Model, func(node Visitable, next Next) error {
if value, ok := node.(*Value); ok { if value, ok := node.(*Value); ok {
if value.Enum != "" && !value.EnumMap()[fmt.Sprintf("%v", value.Target.Interface())] { 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) return next(nil)
+2 -3
View File
@@ -14,9 +14,8 @@ func ApplyDefaults(target interface{}, options ...Option) error {
if err != nil { if err != nil {
return err return err
} }
err = ctx.Validate() if err = ctx.ApplyDefaults(); err != nil {
if err != nil {
return err return err
} }
return ctx.ApplyDefaults() return ctx.Validate()
} }
+2 -2
View File
@@ -209,10 +209,10 @@ func (k *Kong) Parse(args []string) (ctx *Context, err error) {
if err = k.applyHook(ctx, "BeforeApply"); err != nil { if err = k.applyHook(ctx, "BeforeApply"); err != nil {
return nil, &ParseError{error: err, Context: ctx} 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} 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} return nil, &ParseError{error: err, Context: ctx}
} }
if err = k.applyHook(ctx, "AfterApply"); err != nil { if err = k.applyHook(ctx, "AfterApply"); err != nil {
+15 -2
View File
@@ -680,7 +680,7 @@ func TestEnum(t *testing.T) {
Flag string `enum:"a,b,c"` Flag string `enum:"a,b,c"`
} }
_, err := mustNew(t, &cli).Parse([]string{"--flag", "d"}) _, 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 { type commandWithHook struct {
@@ -734,5 +734,18 @@ func TestDefaultEnumValidated(t *testing.T) {
} }
p := mustNew(t, &cli) p := mustNew(t, &cli)
_, err := p.Parse(nil) _, 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\"")
} }