aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/package.scala
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/package.scala')
-rw-r--r--src/main/scala/package.scala52
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)
+
+
}