@@ -47,36 +47,41 @@ public class Flags {
47
47
/// parameters.
48
48
internal static let terminator = " --- "
49
49
50
- /// Prefix for long flag names (consisting of multiple characters)
50
+ /// Prefix for long flag names (consisting of multiple characters).
51
51
internal static let longNamePrefix = " -- "
52
52
53
- /// Prefix for short flag names (consisting of a single character)
53
+ /// Prefix for short flag names (consisting of a single character).
54
54
internal static let shortNamePrefix = " - "
55
55
56
56
/// The registered flags.
57
- private var descriptors : [ Flag ] = [ ]
57
+ public private( set ) var descriptors : [ Flag ] = [ ]
58
58
59
59
/// Internal map from short name to flag.
60
60
private var shortNameMap : [ Character : Flag ] = [ : ]
61
61
62
62
/// Internal map from long name to flag.
63
63
private var longNameMap : [ String : Flag ] = [ : ]
64
64
65
- /// The command-line arguments
65
+ /// The name of the command-line tool.
66
+ public let toolName : String
67
+
68
+ /// The command-line arguments.
66
69
public let arguments : [ String ]
67
70
68
- /// Sequence of global parameters not associated with a flag
71
+ /// Sequence of global parameters not associated with a flag.
69
72
public private( set) var parameters : [ String ] = [ ]
70
73
71
74
/// Initializes a flag set using the default command-line arguments.
72
75
public init ( ) {
73
76
var args = CommandLine . arguments
74
77
args. removeFirst ( )
78
+ self . toolName = CommandLine . arguments. first ?? " <unknown> "
75
79
self . arguments = args
76
80
}
77
81
78
82
/// Initializes a flag set from the given command-line.
79
- public init ( _ arguments: [ String ] ) {
83
+ public init ( toolName: String = " <unknown> " , arguments: [ String ] ) {
84
+ self . toolName = toolName
80
85
self . arguments = arguments
81
86
}
82
87
@@ -157,11 +162,13 @@ public class Flags {
157
162
/// parameters. Function `set` is used to persist the parsed values of type `T`.
158
163
public func argument< T: ConvertibleFromString > ( _ shortName: Character ? ,
159
164
_ longName: String ? = nil ,
165
+ paramIdent: String ? = nil ,
160
166
description: String ,
161
167
repeated: Bool = false ,
162
168
set: @escaping ( T ) -> Void ) -> Argument {
163
169
let flag = Argument ( shortName: shortName,
164
170
longName: longName,
171
+ paramIdent: paramIdent,
165
172
description: description,
166
173
repeated: repeated,
167
174
set: set)
@@ -173,10 +180,12 @@ public class Flags {
173
180
/// name, and description. `value` defines an optional default parameter value.
174
181
public func argument< T: ConvertibleFromString > ( _ shortName: Character ? ,
175
182
_ longName: String ? = nil ,
183
+ paramIdent: String ? = nil ,
176
184
description: String ,
177
185
value: T ? = nil ) -> SingletonArgument < T > {
178
186
let flag = SingletonArgument < T > ( shortName: shortName,
179
187
longName: longName,
188
+ paramIdent: paramIdent,
180
189
description: description,
181
190
value: value)
182
191
self . register ( flag)
@@ -187,15 +196,45 @@ public class Flags {
187
196
/// name, and description. `maxCount` determines how many parameters are accepted at most.
188
197
public func arguments< T: ConvertibleFromString > ( _ shortName: Character ? ,
189
198
_ longName: String ? = nil ,
199
+ paramIdent: String ? = nil ,
190
200
description: String ,
191
201
maxCount: Int = Int . max) -> RepeatedArgument < T > {
192
202
let flag = RepeatedArgument < T > ( shortName: shortName,
193
203
longName: longName,
204
+ paramIdent: paramIdent,
194
205
description: description,
195
206
maxCount: maxCount)
196
207
self . register ( flag)
197
208
return flag
198
209
}
210
+
211
+ public func usageDescription( usageName: String = " USAGE: " ,
212
+ synopsis: String = " [<option> ...] [--] [<arg> ...] " ,
213
+ usageStyle: TextProperties = TextProperties . none,
214
+ optionsName: String = " OPTIONS: " ,
215
+ flagStyle: TextProperties = TextProperties . none,
216
+ indent: String = " " ) -> String {
217
+ var buffer = usageStyle. apply ( to: " \( usageName) \( self . toolName) \( synopsis) " )
218
+ buffer += " \n \( optionsName) \n "
219
+ for flag in self . descriptors {
220
+ var flagStr = " "
221
+ if let shortName = flag. shortName {
222
+ flagStr += " - \( shortName) "
223
+ }
224
+ if let longName = flag. longName {
225
+ if flag. shortName != nil {
226
+ flagStr += " , "
227
+ }
228
+ flagStr += " -- \( longName) "
229
+ }
230
+ if let argument = flag as? Argument {
231
+ flagStr += " \( argument. paramIdent) "
232
+ }
233
+ buffer += indent + flagStyle. apply ( to: flagStr)
234
+ buffer += " \n \( indent) \( indent) \( flag. helpDescription) \n "
235
+ }
236
+ return buffer
237
+ }
199
238
}
200
239
201
240
///
@@ -207,18 +246,25 @@ extension Flags {
207
246
208
247
public func string( _ shortName: Character ? ,
209
248
_ longName: String ? = nil ,
249
+ paramIdent: String ? = nil ,
210
250
description: String ,
211
251
value: String ? = nil ) -> SingletonArgument < String > {
212
- return self . argument ( shortName, longName, description: description, value: value)
252
+ return self . argument ( shortName,
253
+ longName,
254
+ paramIdent: paramIdent,
255
+ description: description,
256
+ value: value)
213
257
}
214
258
215
259
public func `enum`< T: RawRepresentable > ( _ shortName: Character ? ,
216
260
_ longName: String ? = nil ,
261
+ paramIdent: String ? = nil ,
217
262
description: String ,
218
263
value: T ? = nil ) -> SingletonArgument < T >
219
264
where T. RawValue: ConvertibleFromString {
220
265
let flag = SingletonArgument < T > ( shortName: shortName,
221
266
longName: longName,
267
+ paramIdent: paramIdent,
222
268
description: description,
223
269
value: value,
224
270
parse: T . from)
@@ -228,32 +274,49 @@ extension Flags {
228
274
229
275
public func int( _ shortName: Character ? ,
230
276
_ longName: String ? = nil ,
277
+ paramIdent: String ? = nil ,
231
278
description: String ,
232
279
value: Int ? = nil ) -> SingletonArgument < Int > {
233
- return self . argument ( shortName, longName, description: description, value: value)
280
+ return self . argument ( shortName,
281
+ longName,
282
+ paramIdent: paramIdent,
283
+ description: description,
284
+ value: value)
234
285
}
235
286
236
287
public func double( _ shortName: Character ? ,
237
288
_ longName: String ? = nil ,
289
+ paramIdent: String ? = nil ,
238
290
description: String ,
239
291
value: Double ? = nil ) -> SingletonArgument < Double > {
240
- return self . argument ( shortName, longName, description: description, value: value)
292
+ return self . argument ( shortName,
293
+ longName,
294
+ paramIdent: paramIdent,
295
+ description: description,
296
+ value: value)
241
297
}
242
298
243
299
public func strings( _ shortName: Character ? ,
244
300
_ longName: String ? = nil ,
301
+ paramIdent: String ? = nil ,
245
302
description: String ,
246
303
maxCount: Int = Int . max) -> RepeatedArgument < String > {
247
- return self . arguments ( shortName, longName, description: description, maxCount: maxCount)
304
+ return self . arguments ( shortName,
305
+ longName,
306
+ paramIdent: paramIdent,
307
+ description: description,
308
+ maxCount: maxCount)
248
309
}
249
310
250
311
public func enums< T: RawRepresentable > ( _ shortName: Character ? ,
251
312
_ longName: String ? = nil ,
313
+ paramIdent: String ? = nil ,
252
314
description: String ,
253
315
maxCount: Int = Int . max) -> RepeatedArgument < T >
254
316
where T. RawValue: ConvertibleFromString {
255
317
let flag = RepeatedArgument < T > ( shortName: shortName,
256
318
longName: longName,
319
+ paramIdent: paramIdent,
257
320
description: description,
258
321
maxCount: maxCount,
259
322
parse: T . from)
@@ -263,15 +326,25 @@ extension Flags {
263
326
264
327
public func ints( _ shortName: Character ? ,
265
328
_ longName: String ? = nil ,
329
+ paramIdent: String ? = nil ,
266
330
description: String ,
267
331
maxCount: Int = Int . max) -> RepeatedArgument < Int > {
268
- return self . arguments ( shortName, longName, description: description, maxCount: maxCount)
332
+ return self . arguments ( shortName,
333
+ longName,
334
+ paramIdent: paramIdent,
335
+ description: description,
336
+ maxCount: maxCount)
269
337
}
270
338
271
339
public func doubles( _ shortName: Character ? ,
272
340
_ longName: String ? = nil ,
341
+ paramIdent: String ? = nil ,
273
342
description: String ,
274
343
maxCount: Int = Int . max) -> RepeatedArgument < Double > {
275
- return self . arguments ( shortName, longName, description: description, maxCount: maxCount)
344
+ return self . arguments ( shortName,
345
+ longName,
346
+ paramIdent: paramIdent,
347
+ description: description,
348
+ maxCount: maxCount)
276
349
}
277
350
}
0 commit comments