Validate enums (finally).
This commit is contained in:
+11
@@ -119,6 +119,17 @@ func (c *Context) Empty() bool {
|
|||||||
|
|
||||||
// Validate the current context.
|
// Validate the current context.
|
||||||
func (c *Context) Validate() error {
|
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 next(nil)
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
for _, resolver := range c.combineResolvers() {
|
for _, resolver := range c.combineResolvers() {
|
||||||
if err := resolver.Validate(c.Model); err != nil {
|
if err := resolver.Validate(c.Model); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -654,3 +654,11 @@ func TestHooksCalledForDefault(t *testing.T) {
|
|||||||
require.Equal(t, "default", string(cli.Flag))
|
require.Equal(t, "default", string(cli.Flag))
|
||||||
require.Equal(t, []string{"before:default", "after:default"}, ctx.values)
|
require.Equal(t, []string{"before:default", "after:default"}, ctx.values)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestEnum(t *testing.T) {
|
||||||
|
var cli struct {
|
||||||
|
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 \"\"")
|
||||||
|
}
|
||||||
|
|||||||
@@ -269,6 +269,11 @@ func (v *Value) IsBool() bool {
|
|||||||
|
|
||||||
// Parse tokens into value, parse, and validate, but do not write to the field.
|
// Parse tokens into value, parse, and validate, but do not write to the field.
|
||||||
func (v *Value) Parse(scan *Scanner, target reflect.Value) error {
|
func (v *Value) Parse(scan *Scanner, target reflect.Value) error {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
panic(fmt.Sprintf("mapper %T failed to apply to %s: %s", v.Mapper, v.Summary(), err))
|
||||||
|
}
|
||||||
|
}()
|
||||||
err := v.Mapper.Decode(&DecodeContext{Value: v, Scan: scan}, target)
|
err := v.Mapper.Decode(&DecodeContext{Value: v, Scan: scan}, target)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("%s: %s", v.Summary(), err)
|
return fmt.Errorf("%s: %s", v.Summary(), err)
|
||||||
|
|||||||
Reference in New Issue
Block a user