From eef44a276ace54ef0b215c1c4b045afde40daf5b Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Sun, 29 Apr 2018 17:59:47 -0700 Subject: Specify action inline with command --- src/main/scala/package.scala | 52 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 9 deletions(-) (limited to 'src/main/scala/package.scala') diff --git a/src/main/scala/package.scala b/src/main/scala/package.scala index b35740c..f813971 100644 --- a/src/main/scala/package.scala +++ b/src/main/scala/package.scala @@ -1,14 +1,48 @@ 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` { - def parse(command: Command, - arguments: Seq[String]): Either[ParseException, CommandLine] = - Parser.parse(command, arguments) - def parseOrExit(command: Command, arguments: Seq[String])( - action: CommandLine => Any): Unit = parse(command, arguments) match { - case Left(ex) => - System.err.println(ex.getMessage) - System.exit(1) - case Right(res) => action(res) + + 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) + + } -- cgit v1.2.3