...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package cobra
16
17 import (
18 "fmt"
19 "strings"
20 )
21
22 type PositionalArgs func(cmd *Command, args []string) error
23
24
25
26
27
28 func legacyArgs(cmd *Command, args []string) error {
29
30 if !cmd.HasSubCommands() {
31 return nil
32 }
33
34
35 if !cmd.HasParent() && len(args) > 0 {
36 return fmt.Errorf("unknown command %q for %q%s", args[0], cmd.CommandPath(), cmd.findSuggestions(args[0]))
37 }
38 return nil
39 }
40
41
42 func NoArgs(cmd *Command, args []string) error {
43 if len(args) > 0 {
44 return fmt.Errorf("unknown command %q for %q", args[0], cmd.CommandPath())
45 }
46 return nil
47 }
48
49
50
51 func OnlyValidArgs(cmd *Command, args []string) error {
52 if len(cmd.ValidArgs) > 0 {
53
54
55 var validArgs []string
56 for _, v := range cmd.ValidArgs {
57 validArgs = append(validArgs, strings.Split(v, "\t")[0])
58 }
59 for _, v := range args {
60 if !stringInSlice(v, validArgs) {
61 return fmt.Errorf("invalid argument %q for %q%s", v, cmd.CommandPath(), cmd.findSuggestions(args[0]))
62 }
63 }
64 }
65 return nil
66 }
67
68
69 func ArbitraryArgs(cmd *Command, args []string) error {
70 return nil
71 }
72
73
74 func MinimumNArgs(n int) PositionalArgs {
75 return func(cmd *Command, args []string) error {
76 if len(args) < n {
77 return fmt.Errorf("requires at least %d arg(s), only received %d", n, len(args))
78 }
79 return nil
80 }
81 }
82
83
84 func MaximumNArgs(n int) PositionalArgs {
85 return func(cmd *Command, args []string) error {
86 if len(args) > n {
87 return fmt.Errorf("accepts at most %d arg(s), received %d", n, len(args))
88 }
89 return nil
90 }
91 }
92
93
94 func ExactArgs(n int) PositionalArgs {
95 return func(cmd *Command, args []string) error {
96 if len(args) != n {
97 return fmt.Errorf("accepts %d arg(s), received %d", n, len(args))
98 }
99 return nil
100 }
101 }
102
103
104 func RangeArgs(min int, max int) PositionalArgs {
105 return func(cmd *Command, args []string) error {
106 if len(args) < min || len(args) > max {
107 return fmt.Errorf("accepts between %d and %d arg(s), received %d", min, max, len(args))
108 }
109 return nil
110 }
111 }
112
113
114 func MatchAll(pargs ...PositionalArgs) PositionalArgs {
115 return func(cmd *Command, args []string) error {
116 for _, parg := range pargs {
117 if err := parg(cmd, args); err != nil {
118 return err
119 }
120 }
121 return nil
122 }
123 }
124
125
126
127
128
129 func ExactValidArgs(n int) PositionalArgs {
130 return MatchAll(ExactArgs(n), OnlyValidArgs)
131 }
132
View as plain text