Scala command line analyzer using Scallop

I am new to Scala and I need to create a really simple command line parser that provides something like this: I created JRuby in a few minutes: -

java -jar demo.jar --help Command Line Example Application Example: java -jar demo.jar --dn "CN=Test" --nde-url "http://www.example.com" --password "password" For usage see below: -n http://www.example.com -p, --password set the password -c, --capi set add to Windows key-store -h, --help Show this message -v, --version Print version 

Scallop looks like it will be a trick, but I can not find a simple example that works! All the examples I found seem fragmented and do not work for one reason or another.

UPDATE

I found this example that works, but I'm not sure how to relate it to the actual arguments in the main method.

 import org.rogach.scallop._; object cmdlinetest { def main(args: Array[String]) val opts = Scallop(List("-d","--num-limbs","1")) .version("test 1.2.3 (c) 2012 Mr Placeholder") .banner("""Usage: test [OPTION]... [pet-name] |test is an awesome program, which does something funny |Options: |""".stripMargin) .footer("\nFor all other tricks, consult the documentation!") .opt[Boolean]("donkey", descr = "use donkey mode") .opt("monkeys", default = Some(2), short = 'm') .opt[Int]("num-limbs", 'k', "number of libms", required = true) .opt[List[Double]]("params") .opt[String]("debug", hidden = true) .props[String]('D',"some key-value pairs") // you can add parameters a bit later .args(List("-Dalpha=1","-D","betta=2","gamma=3", "Pigeon")) .trailArg[String]("pet name") .verify println(opts.help) } } 
+7
source share
3 answers

Ok, I'll try to add more examples :)

In this case, it would be much better to use ScallopConf:

 import org.rogach.scallop._ object Main extends App { val opts = new ScallopConf(args) { banner(""" NDE/SCEP Certificate enrollment prototype Example: java -jar demo.jar --dn CN=Test --nde-url http://www.example.com --password password For usage see below: """) val ndeUrl = opt[String]("nde-url") val password = opt[String]("password", descr = "set the password") val capi = toggle("capi", prefix = "no-", descrYes = "enable adding to Windows key-store", descrNo = "disable adding to Windows key-store") val version = opt[Boolean]("version", noshort = true, descr = "Print version") val help = opt[Boolean]("help", noshort = true, descr = "Show this message") } println(opts.password()) } 

He prints:

 $ java -jar demo.jar --help NDE/SCEP Certificate enrollment prototype Example: java -jar demo.jar --dn CN=Test --nde-url http://www.example.com --password password For usage see below: -c, --capi enable adding to Windows key-store --no-capi disable adding to Windows key-store --help Show this message -n, --nde-url <arg> -p, --password <arg> set the password --version Print version 
+7
source

Have you read the documentation ? It looks like all you have to do is call get for each parameter you want:

 def get [A] (name: String)(implicit m: Manifest[A]): Option[A] 

It looks like you might need to provide the expected return type in a method call. Try something like this:

 val donkey = opts.get[Boolean]("donkey") val numLimbs = opts.get[Int]("num-limbs") 
+1
source

If you're just looking for a quick and dirty way to parse command line arguments, you can use the pirate , an extremely barebones way to parse arguments. Here's how it would look to describe the use described above:

 import com.mosesn.pirate.Pirate object Main { def main(commandLineArgs: Array[String]) { val args = Pirate("[ -n string ] [ -p string ] [ -chv ]")("-n whatever -c".split(" ")) val c = args.flags.contains('c') val v = args.flags.contains('v') val h = args.flags.contains('h') val n = args.strings.get("n") val p = args.strings.get("p") println(Seq(c, v, h, n, p)) } } 

Of course, for your program, you pass commandLineArgs instead of "-n whatever -c" .

Unfortunately, the pirate does not yet support GNU style arguments, as well as version options or tooltips.

0
source

All Articles