More validation.
This commit is contained in:
@@ -23,7 +23,11 @@ func build(ast interface{}) (app *Application, err error) {
|
|||||||
return nil, fmt.Errorf("expected a pointer to a struct but got %T", ast)
|
return nil, fmt.Errorf("expected a pointer to a struct but got %T", ast)
|
||||||
}
|
}
|
||||||
|
|
||||||
return buildNode(iv, true), nil
|
node := buildNode(iv, true)
|
||||||
|
if len(node.Positional) > 0 && len(node.Children) > 0 {
|
||||||
|
return nil, fmt.Errorf("can't mix positional arguments and branching arguments on %T", ast)
|
||||||
|
}
|
||||||
|
return node, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildNode(v reflect.Value, cmd bool) *Node {
|
func buildNode(v reflect.Value, cmd bool) *Node {
|
||||||
@@ -91,6 +95,10 @@ func buildNode(v reflect.Value, cmd bool) *Node {
|
|||||||
child.Name = name
|
child.Name = name
|
||||||
node.Children = append(node.Children, &Branch{Command: child})
|
node.Children = append(node.Children, &Branch{Command: child})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(child.Positional) > 0 && len(child.Children) > 0 {
|
||||||
|
fail("can't mix positional arguments and branching arguments on %s.%s", v.Type().Name(), ft.Name)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if decoder == nil {
|
if decoder == nil {
|
||||||
fail("no decoder for %s.%s (of type %s)", v.Type(), ft.Name, ft.Type)
|
fail("no decoder for %s.%s (of type %s)", v.Type(), ft.Name, ft.Type)
|
||||||
@@ -118,6 +126,5 @@ func buildNode(v reflect.Value, cmd bool) *Node {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return node
|
return node
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,3 +124,13 @@ func TestMatchingArgField(t *testing.T) {
|
|||||||
_, err := New(&cli)
|
_, err := New(&cli)
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestCantMixPositionalAndBranches(t *testing.T) {
|
||||||
|
var cli struct {
|
||||||
|
Arg string `arg:""`
|
||||||
|
Command struct {
|
||||||
|
} `cmd:""`
|
||||||
|
}
|
||||||
|
_, err := New(&cli)
|
||||||
|
require.Error(t, err)
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user