mirror of
https://github.com/spf13/cobra
synced 2024-11-24 14:47:12 +00:00
Added ExactValidArgs (#765)
This commit is contained in:
parent
40172f1635
commit
f619abc1d7
3 changed files with 59 additions and 0 deletions
|
@ -389,6 +389,7 @@ The following validators are built in:
|
||||||
- `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args.
|
- `MinimumNArgs(int)` - the command will report an error if there are not at least N positional args.
|
||||||
- `MaximumNArgs(int)` - the command will report an error if there are more than N positional args.
|
- `MaximumNArgs(int)` - the command will report an error if there are more than N positional args.
|
||||||
- `ExactArgs(int)` - the command will report an error if there are not exactly N positional args.
|
- `ExactArgs(int)` - the command will report an error if there are not exactly N positional args.
|
||||||
|
- `ExactValidArgs(int)` = the command will report and error if there are not exactly N positional args OR if there are any positional args that are not in the `ValidArgs` field of `Command`
|
||||||
- `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args.
|
- `RangeArgs(min, max)` - the command will report an error if the number of args is not between the minimum and maximum number of expected args.
|
||||||
|
|
||||||
An example of setting the custom validator:
|
An example of setting the custom validator:
|
||||||
|
|
12
args.go
12
args.go
|
@ -78,6 +78,18 @@ func ExactArgs(n int) PositionalArgs {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ExactValidArgs returns an error if
|
||||||
|
// there are not exactly N positional args OR
|
||||||
|
// there are any positional args that are not in the `ValidArgs` field of `Command`
|
||||||
|
func ExactValidArgs(n int) PositionalArgs {
|
||||||
|
return func(cmd *Command, args []string) error {
|
||||||
|
if err := ExactArgs(n)(cmd, args); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return OnlyValidArgs(cmd, args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// RangeArgs returns an error if the number of args is not within the expected range.
|
// RangeArgs returns an error if the number of args is not within the expected range.
|
||||||
func RangeArgs(min int, max int) PositionalArgs {
|
func RangeArgs(min int, max int) PositionalArgs {
|
||||||
return func(cmd *Command, args []string) error {
|
return func(cmd *Command, args []string) error {
|
||||||
|
|
46
args_test.go
46
args_test.go
|
@ -158,6 +158,52 @@ func TestExactArgsWithInvalidCount(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestExactValidArgs(t *testing.T) {
|
||||||
|
c := &Command{Use: "c", Args: ExactValidArgs(3), ValidArgs: []string{"a", "b", "c"}, Run: emptyRun}
|
||||||
|
output, err := executeCommand(c, "a", "b", "c")
|
||||||
|
if output != "" {
|
||||||
|
t.Errorf("Unexpected output: %v", output)
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("Unexpected error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExactValidArgsWithInvalidCount(t *testing.T) {
|
||||||
|
c := &Command{Use: "c", Args: ExactValidArgs(2), Run: emptyRun}
|
||||||
|
_, err := executeCommand(c, "a", "b", "c")
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("Expected an error")
|
||||||
|
}
|
||||||
|
|
||||||
|
got := err.Error()
|
||||||
|
expected := "accepts 2 arg(s), received 3"
|
||||||
|
if got != expected {
|
||||||
|
t.Fatalf("Expected %q, got %q", expected, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestExactValidArgsWithInvalidArgs(t *testing.T) {
|
||||||
|
c := &Command{
|
||||||
|
Use: "c",
|
||||||
|
Args: ExactValidArgs(1),
|
||||||
|
ValidArgs: []string{"one", "two"},
|
||||||
|
Run: emptyRun,
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err := executeCommand(c, "three")
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("Expected an error")
|
||||||
|
}
|
||||||
|
|
||||||
|
got := err.Error()
|
||||||
|
expected := `invalid argument "three" for "c"`
|
||||||
|
if got != expected {
|
||||||
|
t.Errorf("Expected: %q, got: %q", expected, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestRangeArgs(t *testing.T) {
|
func TestRangeArgs(t *testing.T) {
|
||||||
c := &Command{Use: "c", Args: RangeArgs(2, 4), Run: emptyRun}
|
c := &Command{Use: "c", Args: RangeArgs(2, 4), Run: emptyRun}
|
||||||
output, err := executeCommand(c, "a", "b", "c")
|
output, err := executeCommand(c, "a", "b", "c")
|
||||||
|
|
Loading…
Reference in a new issue