vendor/github.com/spf13/cobra/args.go
changeset 242 2a9ec03fe5a1
child 251 1c52a0eeb952
equal deleted inserted replaced
241:e77dad242f4c 242:2a9ec03fe5a1
       
     1 package cobra
       
     2 
       
     3 import (
       
     4 	"fmt"
       
     5 )
       
     6 
       
     7 type PositionalArgs func(cmd *Command, args []string) error
       
     8 
       
     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() {
       
    16 		return nil
       
    17 	}
       
    18 
       
    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]))
       
    22 	}
       
    23 	return nil
       
    24 }
       
    25 
       
    26 // NoArgs returns an error if any args are included.
       
    27 func NoArgs(cmd *Command, args []string) error {
       
    28 	if len(args) > 0 {
       
    29 		return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
       
    30 	}
       
    31 	return nil
       
    32 }
       
    33 
       
    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]))
       
    40 			}
       
    41 		}
       
    42 	}
       
    43 	return nil
       
    44 }
       
    45 
       
    46 // ArbitraryArgs never returns an error.
       
    47 func ArbitraryArgs(cmd *Command, args []string) error {
       
    48 	return nil
       
    49 }
       
    50 
       
    51 // MinimumNArgs returns an error if there is not at least N args.
       
    52 func MinimumNArgs(n int) PositionalArgs {
       
    53 	return func(cmd *Command, args []string) error {
       
    54 		if len(args) < n {
       
    55 			return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args))
       
    56 		}
       
    57 		return nil
       
    58 	}
       
    59 }
       
    60 
       
    61 // MaximumNArgs returns an error if there are more than N args.
       
    62 func MaximumNArgs(n int) PositionalArgs {
       
    63 	return func(cmd *Command, args []string) error {
       
    64 		if len(args) > n {
       
    65 			return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args))
       
    66 		}
       
    67 		return nil
       
    68 	}
       
    69 }
       
    70 
       
    71 // ExactArgs returns an error if there are not exactly n args.
       
    72 func ExactArgs(n int) PositionalArgs {
       
    73 	return func(cmd *Command, args []string) error {
       
    74 		if len(args) != n {
       
    75 			return fmt.Errorf("accepts %d arg(s), received %d", n, len(args))
       
    76 		}
       
    77 		return nil
       
    78 	}
       
    79 }
       
    80 
       
    81 // RangeArgs returns an error if the number of args is not within the expected range.
       
    82 func RangeArgs(min int, max int) PositionalArgs {
       
    83 	return func(cmd *Command, args []string) error {
       
    84 		if len(args) < min || len(args) > max {
       
    85 			return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args))
       
    86 		}
       
    87 		return nil
       
    88 	}
       
    89 }