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 {
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)
+2 -3
View File
@@ -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()
}
+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 {
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 {
+15 -2
View File
@@ -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\"")
}