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