Commandant is a Swift framework for parsing command-line arguments, inspired by Argo (which is, in turn, inspired by the Haskell library Aeson).
With Commandant, a command and its associated options could be defined as follows:
structLogCommand:CommandProtocol{typealiasOptions=LogOptionsletverb="log"letfunction="Reads the log"func run(_ options:Options)->Result<(),YourErrorType>{ // Use the parsed options to do something interesting here. return()}}structLogOptions:OptionsProtocol{letlines:Intletverbose:BoolletlogName:Stringstaticfunc create(_ lines:Int)->(Bool)->(String)->LogOptions{return{ verbose in{ logName inLogOptions(lines: lines, verbose: verbose, logName: logName)}}}staticfunc evaluate(_ m:CommandMode)->Result<LogOptions,CommandantError<YourErrorType>>{return create <*> m <|Option(key:"lines", defaultValue:0, usage:"the number of lines to read from the logs")<*> m <|Option(key:"verbose", defaultValue:false, usage:"show verbose output")<*> m <|Argument(usage:"the log to read")}}Then, each available command should be added to a registry:
letcommands=CommandRegistry<YourErrorType>() commands.register(LogCommand()) commands.register(VersionCommand())After which, arguments can be parsed by simply invoking the registry:
vararguments=CommandLine.arguments // Remove the executable name. assert(!arguments.isEmpty) arguments.remove(at:0)iflet verb = arguments.first { // Remove the command name. arguments.remove(at:0)iflet result = commands.run(command: verb, arguments: arguments){ // Handle success or failure. }else{ // Unrecognized command. }}else{ // No command given. }For real-world examples, see the implementation of the Carthage command-line tool.
Commandant is released under the MIT license.