aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/package.scala
blob: 68936cda07994189b086da8c05c6dd4ed75e561d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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)

}