0001    #if os(Linux)
0002      import Glibc
0003    #else
0004      import Darwin.libc
0005    #endif
0006    
0007    
0008    /// Extensions to CommandType to provide convinience running methods for CLI tools
0009    extension CommandType {
0010      /// Run the command using the `Process.argument`, removing the executable name
0011      @noreturn public func run(version:String? = nil) {
0012        let parser = ArgumentParser(arguments: Process.arguments)
0013    
0014        if parser.hasOption("version") && !parser.hasOption("help") {
0015          if let version = version {
0016            print(version)
0017            exit(0)
0018          }
0019        }
0020    
0021        let executableName = parser.shift()!  // Executable Name
0022    
0023        do {
0024          try run(parser)
0025        } catch let error as Help {
0026          let help = error.reraise("$ \(executableName)")
0027          fputs("\(help)\n", stderr)
0028          exit(1)
0029        } catch GroupError.NoCommand(let path, let group) {
0030          var usage = "$ \(executableName)"
0031          if let path = path {
0032            usage += " \(path)"
0033          }
0034          let help = Help([], command: usage, group: group)
0035          fputs("\(help)\n", stderr)
0036          exit(1)
0037        } catch let error as UsageError {
0038          fputs("\(error)\n", stderr)
0039          exit(1)
0040        } catch {
0041          fputs("\(error)\n", stderr)
0042          exit(1)
0043        }
0044    
0045        exit(0)
0046      }
0047    }
0048