+1
-1
@@ -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
@@ -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()
|
||||
}
|
||||
|
||||
@@ -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
@@ -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\"")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user