diff options
Diffstat (limited to 'src/main/scala/package.scala')
-rw-r--r-- | src/main/scala/package.scala | 52 |
1 files changed, 43 insertions, 9 deletions
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) + + } |