@@ -47,36 +47,41 @@ public class Flags {
4747 /// parameters.
4848 internal static let terminator = " --- "
4949
50- /// Prefix for long flag names (consisting of multiple characters)
50+ /// Prefix for long flag names (consisting of multiple characters).
5151 internal static let longNamePrefix = " -- "
5252
53- /// Prefix for short flag names (consisting of a single character)
53+ /// Prefix for short flag names (consisting of a single character).
5454 internal static let shortNamePrefix = " - "
5555
5656 /// The registered flags.
57- private var descriptors : [ Flag ] = [ ]
57+ public private( set ) var descriptors : [ Flag ] = [ ]
5858
5959 /// Internal map from short name to flag.
6060 private var shortNameMap : [ Character : Flag ] = [ : ]
6161
6262 /// Internal map from long name to flag.
6363 private var longNameMap : [ String : Flag ] = [ : ]
6464
65- /// The command-line arguments
65+ /// The name of the command-line tool.
66+ public let toolName : String
67+
68+ /// The command-line arguments.
6669 public let arguments : [ String ]
6770
68- /// Sequence of global parameters not associated with a flag
71+ /// Sequence of global parameters not associated with a flag.
6972 public private( set) var parameters : [ String ] = [ ]
7073
7174 /// Initializes a flag set using the default command-line arguments.
7275 public init ( ) {
7376 var args = CommandLine . arguments
7477 args. removeFirst ( )
78+ self . toolName = CommandLine . arguments. first ?? " <unknown> "
7579 self . arguments = args
7680 }
7781
7882 /// 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
8085 self . arguments = arguments
8186 }
8287
@@ -157,11 +162,13 @@ public class Flags {
157162 /// parameters. Function `set` is used to persist the parsed values of type `T`.
158163 public func argument< T: ConvertibleFromString > ( _ shortName: Character ? ,
159164 _ longName: String ? = nil ,
165+ paramIdent: String ? = nil ,
160166 description: String ,
161167 repeated: Bool = false ,
162168 set: @escaping ( T ) -> Void ) -> Argument {
163169 let flag = Argument ( shortName: shortName,
164170 longName: longName,
171+ paramIdent: paramIdent,
165172 description: description,
166173 repeated: repeated,
167174 set: set)
@@ -173,10 +180,12 @@ public class Flags {
173180 /// name, and description. `value` defines an optional default parameter value.
174181 public func argument< T: ConvertibleFromString > ( _ shortName: Character ? ,
175182 _ longName: String ? = nil ,
183+ paramIdent: String ? = nil ,
176184 description: String ,
177185 value: T ? = nil ) -> SingletonArgument < T > {
178186 let flag = SingletonArgument < T > ( shortName: shortName,
179187 longName: longName,
188+ paramIdent: paramIdent,
180189 description: description,
181190 value: value)
182191 self . register ( flag)
@@ -187,15 +196,45 @@ public class Flags {
187196 /// name, and description. `maxCount` determines how many parameters are accepted at most.
188197 public func arguments< T: ConvertibleFromString > ( _ shortName: Character ? ,
189198 _ longName: String ? = nil ,
199+ paramIdent: String ? = nil ,
190200 description: String ,
191201 maxCount: Int = Int . max) -> RepeatedArgument < T > {
192202 let flag = RepeatedArgument < T > ( shortName: shortName,
193203 longName: longName,
204+ paramIdent: paramIdent,
194205 description: description,
195206 maxCount: maxCount)
196207 self . register ( flag)
197208 return flag
198209 }
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+ }
199238}
200239
201240///
@@ -207,18 +246,25 @@ extension Flags {
207246
208247 public func string( _ shortName: Character ? ,
209248 _ longName: String ? = nil ,
249+ paramIdent: String ? = nil ,
210250 description: String ,
211251 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)
213257 }
214258
215259 public func `enum`< T: RawRepresentable > ( _ shortName: Character ? ,
216260 _ longName: String ? = nil ,
261+ paramIdent: String ? = nil ,
217262 description: String ,
218263 value: T ? = nil ) -> SingletonArgument < T >
219264 where T. RawValue: ConvertibleFromString {
220265 let flag = SingletonArgument < T > ( shortName: shortName,
221266 longName: longName,
267+ paramIdent: paramIdent,
222268 description: description,
223269 value: value,
224270 parse: T . from)
@@ -228,32 +274,49 @@ extension Flags {
228274
229275 public func int( _ shortName: Character ? ,
230276 _ longName: String ? = nil ,
277+ paramIdent: String ? = nil ,
231278 description: String ,
232279 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)
234285 }
235286
236287 public func double( _ shortName: Character ? ,
237288 _ longName: String ? = nil ,
289+ paramIdent: String ? = nil ,
238290 description: String ,
239291 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)
241297 }
242298
243299 public func strings( _ shortName: Character ? ,
244300 _ longName: String ? = nil ,
301+ paramIdent: String ? = nil ,
245302 description: String ,
246303 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)
248309 }
249310
250311 public func enums< T: RawRepresentable > ( _ shortName: Character ? ,
251312 _ longName: String ? = nil ,
313+ paramIdent: String ? = nil ,
252314 description: String ,
253315 maxCount: Int = Int . max) -> RepeatedArgument < T >
254316 where T. RawValue: ConvertibleFromString {
255317 let flag = RepeatedArgument < T > ( shortName: shortName,
256318 longName: longName,
319+ paramIdent: paramIdent,
257320 description: description,
258321 maxCount: maxCount,
259322 parse: T . from)
@@ -263,15 +326,25 @@ extension Flags {
263326
264327 public func ints( _ shortName: Character ? ,
265328 _ longName: String ? = nil ,
329+ paramIdent: String ? = nil ,
266330 description: String ,
267331 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)
269337 }
270338
271339 public func doubles( _ shortName: Character ? ,
272340 _ longName: String ? = nil ,
341+ paramIdent: String ? = nil ,
273342 description: String ,
274343 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)
276349 }
277350}
0 commit comments