+15
-2
@@ -132,10 +132,10 @@ func (c *Context) Empty() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Validate the current context.
|
// Validate the current context.
|
||||||
func (c *Context) Validate() error {
|
func (c *Context) Validate() error { // nolint: gocyclo
|
||||||
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 != "" {
|
if value.Enum != "" && (!value.Required || value.Default != "") {
|
||||||
if err := checkEnum(value, value.Target); err != nil {
|
if err := checkEnum(value, value.Target); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -152,6 +152,19 @@ func (c *Context) Validate() error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for _, path := range c.Path {
|
for _, path := range c.Path {
|
||||||
|
var value *Value
|
||||||
|
switch {
|
||||||
|
case path.Flag != nil:
|
||||||
|
value = path.Flag.Value
|
||||||
|
|
||||||
|
case path.Positional != nil:
|
||||||
|
value = path.Positional
|
||||||
|
}
|
||||||
|
if value != nil && value.Tag.Enum != "" {
|
||||||
|
if err := checkEnum(value, value.Target); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
if err := checkMissingFlags(path.Flags); err != nil {
|
if err := checkMissingFlags(path.Flags); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -791,3 +791,27 @@ func TestEnumSequence(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, []string{"a"}, cli.State)
|
require.Equal(t, []string{"a"}, cli.State)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue40EnumAcrossCommands(t *testing.T) {
|
||||||
|
var cli struct {
|
||||||
|
One struct {
|
||||||
|
OneArg string `arg:"" required:""`
|
||||||
|
} `cmd:""`
|
||||||
|
Two struct {
|
||||||
|
TwoArg string `arg:"" enum:"a,b,c" required:""`
|
||||||
|
} `cmd:""`
|
||||||
|
Three struct {
|
||||||
|
ThreeArg string `arg:"" optional:"" default:"a" enum:"a,b,c"`
|
||||||
|
} `cmd:""`
|
||||||
|
}
|
||||||
|
|
||||||
|
p := mustNew(t, &cli)
|
||||||
|
_, err := p.Parse([]string{"one", "two"})
|
||||||
|
require.NoError(t, err)
|
||||||
|
_, err = p.Parse([]string{"two", "d"})
|
||||||
|
require.Error(t, err)
|
||||||
|
_, err = p.Parse([]string{"three", "d"})
|
||||||
|
require.Error(t, err)
|
||||||
|
_, err = p.Parse([]string{"three", "c"})
|
||||||
|
require.NoError(t, err)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user