Simple model around scallop that streamlines and removes the boilerplate to define CLI applications and create sub-commands.
In this model you create Commands that configure each Subcommand. These commands are also in charge of executing the command logic.
Once those commands have been defined you can add them to an application.
NOTE:
This example was inspired by the article "Creating Neat .NET Core Command Line Apps"
// HideCommand.scala
import io.onema.command.Command
class HideCommand extends Command("hide") {
//--- Methods ---
override def configure(): Unit = {
description("Instruct the ninja to hide in a specific location.")
addTrailArg(trailArg[String](
name = "where",
required = false,
descr = "Hiding location",
default = Some("under a turtle")
))
}
override def execute(): Unit = {
val location = getOption("where").getOrElse("???")
println(s"Ninja is hidden $location")
}
}Now create another command
// AttackCommand.scala
import io.onema.command.Command
class AttackCommand extends Command("attack") {
//--- Methods ---
override def configure(): Unit = {
description(
s"""
|Usage: ninja attack [OPTION]
|Instruct the ninja to go and attack!
|
|Options:
""".stripMargin)
}
addOption(opt[List[String]](
name = "exclude",
descr = "Things to exclude while attacking.",
required = false,
default = Option(List("civilians"))
))
addOption(opt[String](
name = "scream",
short = 's',
required = false,
descr = "Scream while attacking"
))
override def execute(): Unit = {
val exclusions = getOption[List[String]]("exclude").getOrElse(List[String]())
val attacking = Seq("dragons", "badguys", "civilians", "animals")
.filter(x => !exclusions.contains(x))
println(s"Ninja is attacking ${attacking.mkString(", ")}")
getOption[String]("scream").toOption match {
case Some(x) => println(x)
case None =>
}
}
}// Main.scala
import io.onema.command.Application
object Main {
def main(args: Array[String]): Unit = {
val version =
s"""
| __ _ _____ __ _ _____ _______
| | \\ | | | \\ | | |_____|
| | \\_| __|__ | \\_| __| | |
| 0.1.0
""".stripMargin
val description =
"""
|Usage: ninja [hide|attack]
|Ninja command
|
|Options:
""".stripMargin
val app = new Application("ninja", version, description)
app.add(new HideCommand)
app.add(new AttackCommand)
// Add additional commands here...
app.run(args)
}
}> ninja hide "under a rock"
ninja is hiding under a rock
> ninja hide
ninja is hiding under a turtle
> ninja attack --exclude civilians
Ninja is attacking dragons, badguys, animals
> ninja attack --help
Usage: ninja attack [OPTION]
Instruct the ninja to go and attack!
Options:
-e, --exclude <arg>... Things to exclude while attacking.
-s, --scream <arg> Scream while attacking
-h, --help Show help message