7 type PositionalArgs func(cmd *Command, args []string) error
9 // Legacy arg validation has the following behaviour:
10 // - root commands with no subcommands can take arbitrary arguments
11 // - root commands with subcommands will do subcommand validity checking
12 // - subcommands will always accept arbitrary arguments
13 func legacyArgs(cmd *Command, args []string) error {
14 // no subcommand, always take args
15 if !cmd.HasSubCommands() {
19 // root command with subcommands, do subcommand checking
20 if !cmd.HasParent() && len(args) > 0 {
21 return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0]))
26 // NoArgs returns an error if any args are included
27 func NoArgs(cmd *Command, args []string) error {
29 return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
34 // OnlyValidArgs returns an error if any args are not in the list of ValidArgs
35 func OnlyValidArgs(cmd *Command, args []string) error {
36 if len(cmd.ValidArgs) > 0 {
37 for _, v := range args {
38 if !stringInSlice(v, cmd.ValidArgs) {
39 return fmt.Errorf("invalid argument %q for %q%s", v, cmd.CommandPath(), cmd.findSuggestions(args[0]))
46 func stringInSlice(a string, list []string) bool {
47 for _, b := range list {
55 // ArbitraryArgs never returns an error
56 func ArbitraryArgs(cmd *Command, args []string) error {
60 // MinimumNArgs returns an error if there is not at least N args
61 func MinimumNArgs(n int) PositionalArgs {
62 return func(cmd *Command, args []string) error {
64 return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args))
70 // MaximumNArgs returns an error if there are more than N args
71 func MaximumNArgs(n int) PositionalArgs {
72 return func(cmd *Command, args []string) error {
74 return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args))
80 // ExactArgs returns an error if there are not exactly n args
81 func ExactArgs(n int) PositionalArgs {
82 return func(cmd *Command, args []string) error {
84 return fmt.Errorf("accepts %d arg(s), received %d", n, len(args))
90 // RangeArgs returns an error if the number of args is not within the expected range
91 func RangeArgs(min int, max int) PositionalArgs {
92 return func(cmd *Command, args []string) error {
93 if len(args) < min || len(args) > max {
94 return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args))