package commando class CommandBuilder(name: String, params: Seq[Parameter]) { private def optionals = params.collect{ case opt: Optional => opt }.toSet private def positionals = params.collect{ case pos: Positional => pos } def run(action: Command.Arguments => Unit): Command = Command(name, optionals, positionals, Set.empty, Some(action)) def sub(commands: Command*): Command = Command(name, optionals, positionals, commands.toSet, None) } object `package` { val DefaultErrorHandler: (Command, String) => Unit = (command: Command, err: String) => { System.err.println(s"${command.name}: $err") System.exit(2) } def parse(arguments: Seq[String], command: Command, onError: (Command, String) => Unit = DefaultErrorHandler): Unit = Parser.parse(arguments, command, onError) def cmd(name: String)(params: Parameter*): CommandBuilder = new CommandBuilder(name, params) def opt(name: String, short: Char = '\u0000', param: (String, Boolean) = ("", false)): Optional = Optional( name, if (short == '\u0000') None else Some(short), argumentAllowed = (param != ("", false)), argumentRequired = (param != ("", false)) && param._2, parameterName = if(param._1 == "") "param" else param._1 ) def pos(name: String, required: Boolean = true): Positional = Positional(name, required) }