18
18
import java .io .IOException ;
19
19
import java .util .*;
20
20
21
+ import org .apache .commons .lang3 .StringUtils ;
22
+
23
+ import com .github .rvesse .airline .builder .ParserBuilder ;
21
24
import com .github .rvesse .airline .help .UsageHelper ;
22
25
import com .github .rvesse .airline .help .common .AbstractPrintedCommandGroupUsageGenerator ;
23
26
import com .github .rvesse .airline .help .sections .HelpHint ;
26
29
import com .github .rvesse .airline .model .CommandMetadata ;
27
30
import com .github .rvesse .airline .model .GlobalMetadata ;
28
31
import com .github .rvesse .airline .model .OptionMetadata ;
32
+ import com .github .rvesse .airline .model .ParserMetadata ;
33
+
29
34
import static com .github .rvesse .airline .help .UsageHelper .DEFAULT_COMMAND_COMPARATOR ;
30
35
import static com .github .rvesse .airline .help .UsageHelper .DEFAULT_OPTION_COMPARATOR ;
31
36
import static com .github .rvesse .airline .help .UsageHelper .DEFAULT_HINT_COMPARATOR ;
@@ -86,7 +91,8 @@ protected void usage(GlobalMetadata<T> global, CommandGroupMetadata[] groups, Us
86
91
* @param groups
87
92
* Group(s) meta-data
88
93
*
89
- * @throws IOException Thrown if there is a problem generating usage output
94
+ * @throws IOException
95
+ * Thrown if there is a problem generating usage output
90
96
*/
91
97
protected void outputOptions (UsagePrinter out , GlobalMetadata <T > global , CommandGroupMetadata [] groups )
92
98
throws IOException {
@@ -119,6 +125,20 @@ protected void outputOptions(UsagePrinter out, GlobalMetadata<T> global, Command
119
125
}
120
126
}
121
127
128
+ protected String getArgsUsage (CommandMetadata command ) {
129
+ StringBuilder builder = new StringBuilder ();
130
+ if (command .hasPositionalArguments ()) {
131
+ builder .append (toUsage (command .getPositionalArguments ()));
132
+ }
133
+ if (command .hasNonPositionalArguments ()) {
134
+ if (command .hasPositionalArguments ()) {
135
+ builder .append (' ' );
136
+ }
137
+ builder .append (toUsage (command .getArguments ()));
138
+ }
139
+ return builder .toString ();
140
+ }
141
+
122
142
/**
123
143
* Outputs a documentation section detailing a usage synopsis
124
144
*
@@ -128,7 +148,8 @@ protected void outputOptions(UsagePrinter out, GlobalMetadata<T> global, Command
128
148
* Global meta-data
129
149
* @param groups
130
150
* Groups meta-data
131
- * @throws IOException Thrown if there is a problem generating usage output
151
+ * @throws IOException
152
+ * Thrown if there is a problem generating usage output
132
153
*/
133
154
protected void outputSynopsis (UsagePrinter out , GlobalMetadata <T > global , CommandGroupMetadata [] groups )
134
155
throws IOException {
@@ -137,6 +158,8 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
137
158
138
159
CommandGroupMetadata group = groups [groups .length - 1 ];
139
160
List <CommandMetadata > commands = sortCommands (group .getCommands ());
161
+ ParserMetadata <T > parserConfig = global != null ? global .getParserConfiguration ()
162
+ : ParserBuilder .<T > defaultConfiguration ();
140
163
141
164
// Populate group info via an extra for loop through commands
142
165
boolean hasDefaultCommand = group .getDefaultCommand () != null ;
@@ -156,17 +179,20 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
156
179
commonGroupOptions = new ArrayList <>(command .getCommandOptions ());
157
180
}
158
181
if (commonGroupArgs == null ) {
159
- commonGroupArgs = (command . getArguments () != null ? toUsage ( command . getArguments ()) : "" );
182
+ commonGroupArgs = getArgsUsage (command );
160
183
}
161
184
162
185
commonGroupOptions .retainAll (command .getCommandOptions ());
163
186
if (command .getCommandOptions ().size () > commonGroupOptions .size ()) {
164
187
hasCommandSpecificOptions = true ;
165
188
}
166
- if (commonGroupArgs != ( command . getArguments () != null ? toUsage (command . getArguments ()) : "" )) {
189
+ if (! StringUtils . equals ( commonGroupArgs , getArgsUsage (command ) )) {
167
190
hasCommandSpecificArgs = true ;
168
191
}
169
192
}
193
+ if (commands .size () == 1 ) {
194
+ hasCommandSpecificArgs = true ;
195
+ }
170
196
for (CommandGroupMetadata subGroup : group .getSubGroups ()) {
171
197
groupNames .add (subGroup .getName ());
172
198
if (commonGroupOptions == null ) {
@@ -206,17 +232,19 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
206
232
synopsis .append (" | " );
207
233
}
208
234
}
209
- synopsis .append ("} [--] " );
235
+ synopsis .append ("}" );
210
236
if (commonGroupOptions .size () > 0 ) {
211
237
synopsis .appendWords (toSynopsisUsage (commonGroupOptions ));
212
238
}
213
239
if (hasCommandSpecificOptions ) {
214
240
synopsis .append (" [cmd-options]" );
215
241
}
216
242
if (hasCommandSpecificArgs ) {
243
+ synopsis .append (String .format ("[%s]" , parserConfig .getArgumentsSeparator ()));
217
244
synopsis .append (" <cmd-args>" );
218
245
}
219
246
synopsis .newline ();
247
+ synopsis .flush ();
220
248
Map <String , String > cmdOptions = new TreeMap <>();
221
249
Map <String , String > cmdArguments = new TreeMap <>();
222
250
Map <String , String > subGroups = new TreeMap <>();
@@ -249,6 +277,7 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
249
277
grps .append (groupName + ": " + subGroups .get (groupName )).newline ();
250
278
}
251
279
}
280
+ synopsis .flush ();
252
281
253
282
for (CommandMetadata command : commands ) {
254
283
@@ -264,7 +293,7 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
264
293
}
265
294
if (hasCommandSpecificArgs ) {
266
295
cmdArguments .put (command .getName (),
267
- (command . getArguments () != null ? toUsage ( command . getArguments ()) : "" ));
296
+ getArgsUsage (command ));
268
297
}
269
298
}
270
299
}
@@ -288,6 +317,7 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
288
317
synopsis .newline ().append ("See" ).append ("'" + global .getName ()).append ("help " )
289
318
.appendWords (UsageHelper .toGroupNames (Arrays .asList (groups )))
290
319
.appendOnOneLine (" <command>' for more information on a specific command." ).newline ();
320
+ synopsis .flush ();
291
321
}
292
322
293
323
/**
@@ -299,7 +329,8 @@ protected void outputSynopsis(UsagePrinter out, GlobalMetadata<T> global, Comman
299
329
* Global meta-data
300
330
* @param groups
301
331
* Groups meta-data
302
- * @throws IOException Thrown if there is a problem generating usage output
332
+ * @throws IOException
333
+ * Thrown if there is a problem generating usage output
303
334
*/
304
335
protected void outputDescription (UsagePrinter out , GlobalMetadata <T > global , CommandGroupMetadata [] groups )
305
336
throws IOException {
0 commit comments