mirror of
https://github.com/spf13/cobra
synced 2025-05-06 13:27:26 +00:00
Updates NoArgs to also report invalid argument
NoArgs currently reports "unknown command" in all cases, which can be is a little misleading to the user if there are no subcommands. Change it as follows - if subcommands and one extra arg, say "unknown command" - otherwise, say "invalid argument(s)" and show all extra args This should produce more meaningful error messages to users, and works for both the root and sub-commands.
This commit is contained in:
parent
4dab30cb33
commit
d8e244d161
2 changed files with 13 additions and 4 deletions
13
args.go
13
args.go
|
@ -2,6 +2,7 @@ package cobra
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type PositionalArgs func(cmd *Command, args []string) error
|
type PositionalArgs func(cmd *Command, args []string) error
|
||||||
|
@ -25,10 +26,18 @@ func legacyArgs(cmd *Command, args []string) error {
|
||||||
|
|
||||||
// NoArgs returns an error if any args are included.
|
// NoArgs returns an error if any args are included.
|
||||||
func NoArgs(cmd *Command, args []string) error {
|
func NoArgs(cmd *Command, args []string) error {
|
||||||
if len(args) > 0 {
|
if len(args) == 0 {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we have exactly one argument and we have sub-commands, then assume the user
|
||||||
|
// made a typo on a subcommand, or typed the wrong subcommand
|
||||||
|
if len(args) == 1 && len(cmd.commands) > 0 {
|
||||||
return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
|
return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
// Otherwise, assume that this is one or more invalid arguments
|
||||||
|
return fmt.Errorf("invalid argument(s) %q for %q", strings.Join(args, " "), cmd.CommandPath())
|
||||||
}
|
}
|
||||||
|
|
||||||
// OnlyValidArgs returns an error if any args are not in the list of ValidArgs.
|
// OnlyValidArgs returns an error if any args are not in the list of ValidArgs.
|
||||||
|
|
|
@ -26,7 +26,7 @@ func TestNoArgsWithArgs(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
got := err.Error()
|
got := err.Error()
|
||||||
expected := `unknown command "illegal" for "c"`
|
expected := `invalid argument(s) "illegal" for "c"`
|
||||||
if got != expected {
|
if got != expected {
|
||||||
t.Errorf("Expected: %q, got: %q", expected, got)
|
t.Errorf("Expected: %q, got: %q", expected, got)
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,7 @@ func TestChildTakesNoArgs(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
got := err.Error()
|
got := err.Error()
|
||||||
expected := `unknown command "illegal" for "root child"`
|
expected := `invalid argument(s) "illegal args" for "root child"`
|
||||||
if !strings.Contains(got, expected) {
|
if !strings.Contains(got, expected) {
|
||||||
t.Errorf("expected %q, got %q", expected, got)
|
t.Errorf("expected %q, got %q", expected, got)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue