Skip to content

eFog-R/Commandant

Repository files navigation

Commandant

Commandant is a Swift framework for parsing command-line arguments, inspired by Argo (which is, in turn, inspired by the Haskell library Aeson).

Reviewed by Hound

Example

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.

License

Commandant is released under the MIT license.

About

Type-safe command line argument handling

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Swift97.6%
  • Ruby1.6%
  • Objective-C0.8%