@@ -49,7 +49,7 @@ func NewFlags(name string) *Flags {
49
49
flags := new (Flags )
50
50
flags .FlagSet = flag .NewFlagSet (name , flag .ContinueOnError )
51
51
flags .names = make (map [string ]* Value )
52
- flags .FlagSet .Usage = flags . PrintUsage
52
+ flags .FlagSet .Usage = func () {}
53
53
54
54
// Register global flags
55
55
flags .Bool ("" , "debug" , false , "Enable debug logging" )
@@ -70,6 +70,9 @@ func (flags *Flags) Register(c Cmd) {
70
70
func (flags * Flags ) Parse (args []string ) error {
71
71
// Parse command line
72
72
if err := flags .FlagSet .Parse (args ); err != nil {
73
+ if err == flag .ErrHelp {
74
+ flags .PrintUsage ()
75
+ }
73
76
return err
74
77
}
75
78
@@ -82,22 +85,24 @@ func (flags *Flags) Parse(args []string) error {
82
85
// Set client options
83
86
opts := []client.ClientOpt {}
84
87
if flags .GetBool ("debug" ) {
85
- verbose := flags . GetBool ( " verbose" )
86
- opts = append (opts , client .OptTrace (flags .Output (), verbose ))
88
+ // Append debug option with optional verbose
89
+ opts = append (opts , client .OptTrace (flags .Output (), flags . GetBool ( " verbose" ) ))
87
90
}
88
91
89
92
// Parse the commands
90
93
for _ , cmd := range flags .cmds {
91
- cmd .Parse (flags , opts ... )
94
+ if err := cmd .Parse (flags , opts ... ); err != nil {
95
+ return fmt .Errorf ("%v: %w" , cmd .Name , err )
96
+ }
92
97
}
93
98
94
99
// Return success
95
100
return nil
96
101
}
97
102
98
- // GetCommand returns a command set from a name, or nil if the command set does
103
+ // GetCommandSet returns a command set from a name, or nil if the command set does
99
104
// not exist
100
- func (flags * Flags ) GetCommand (name string ) * Cmd {
105
+ func (flags * Flags ) GetCommandSet (name string ) * Cmd {
101
106
for _ , cmd := range flags .cmds {
102
107
if cmd .Name == name {
103
108
return & cmd
@@ -149,38 +154,65 @@ func (flags *Flags) PrintVersion() {
149
154
func (flags * Flags ) PrintUsage () {
150
155
w := flags .Output ()
151
156
if flags .NArg () == 1 {
152
- cmd := flags .GetCommand (flags .Arg (0 ))
153
- if cmd == nil {
154
- fmt .Fprintf (w , "Unknown command: %q\n " , flags .Arg (0 ))
155
- return
157
+ cmd := flags .GetCommandSet (flags .Arg (0 ))
158
+ if cmd != nil {
159
+ flags .PrintCommandUsage (cmd )
156
160
}
157
- fmt .Fprintln (w , flags .Name (), cmd .Name )
158
- fmt .Fprintln (w , " " , cmd .Description )
159
- fmt .Fprintln (w , "" )
160
- flags .PrintCommandFlags (cmd .Name )
161
161
} else {
162
- fmt .Fprintln (w , flags .Name ())
162
+ fmt .Fprintln (w , "Name:" , flags .Name ())
163
163
fmt .Fprintln (w , " General command-line interface to API clients" )
164
164
fmt .Fprintln (w , "" )
165
- fmt .Fprintln (w , "Syntax:" )
165
+
166
+ // Command Sets
167
+ fmt .Fprintln (w , "Command Sets:" )
168
+ for _ , cmd := range flags .cmds {
169
+ fmt .Fprintln (w , " " , flags .Name (), cmd .Name )
170
+ fmt .Fprintln (w , " " , cmd .Description )
171
+ fmt .Fprintln (w , "" )
172
+ }
173
+
174
+ // Help
175
+ fmt .Fprintln (w , "Help:" )
166
176
fmt .Fprintln (w , " " , flags .Name (), "version" )
167
177
fmt .Fprintln (w , " " , "Return the version of the application" )
168
178
fmt .Fprintln (w , "" )
179
+
180
+ // Help for command sets
169
181
for _ , cmd := range flags .cmds {
170
182
fmt .Fprintln (w , " " , flags .Name (), "-help" , cmd .Name )
171
183
fmt .Fprintln (w , " " , "Display" , cmd .Name , "command syntax" )
172
184
fmt .Fprintln (w , "" )
173
185
}
186
+
187
+ fmt .Fprintln (w , "" )
188
+ flags .PrintGlobalFlags ()
174
189
}
175
- fmt .Fprintln (w , "" )
176
- flags .PrintGlobalFlags ()
177
190
}
178
191
179
192
// PrintGlobalFlags prints out the global flags
180
193
func (flags * Flags ) PrintGlobalFlags () {
181
194
flags .PrintCommandFlags ("" )
182
195
}
183
196
197
+ // PrintCommandUsage prints the usage of a commandset
198
+ func (flags * Flags ) PrintCommandUsage (cmd * Cmd ) {
199
+ w := flags .Output ()
200
+ fmt .Fprintln (w , "Name:" , flags .Name (), cmd .Name )
201
+ fmt .Fprintln (w , " " , cmd .Description )
202
+ fmt .Fprintln (w , "" )
203
+
204
+ // Help for command sets
205
+ fmt .Fprintln (w , "Commands:" )
206
+ for _ , fn := range cmd .Fn {
207
+ fmt .Fprintln (w , " " , flags .Name (), cmd .Name , fn .Name )
208
+ fmt .Fprintln (w , " " , fn .Description )
209
+ fmt .Fprintln (w , "" )
210
+ }
211
+ flags .PrintCommandFlags (cmd .Name )
212
+ fmt .Fprintln (w , "" )
213
+ flags .PrintGlobalFlags ()
214
+ }
215
+
184
216
// PrintGlobalFlags prints out the global flags
185
217
func (flags * Flags ) PrintCommandFlags (cmd string ) {
186
218
w := flags .Output ()
0 commit comments