Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 85 lines (69 sloc) 2.914 kb
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 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
/* NEST (New Scala Test)
* Copyright 2007-2013 LAMP/EPFL
* @author Paul Phillips
*/

package scala.tools
package cmd

/** A sample command specification for illustrative purposes.
* First take advantage of the meta-options:
*
* // this command creates an executable runner script "demo"
* % scala scala.tools.cmd.Demo --self-update demo
*
* // this one creates and sources a completion file - note backticks
* % `./demo --bash`
*
* // and now you have a runner with working completion
* % ./demo --<tab>
* --action --defint --int
* --bash --defstr --str
* --defenv --self-update --unary
*
* The normal option configuration is plausibly self-explanatory.
*/
trait DemoSpec extends Spec with Meta.StdOpts with Interpolation {
  lazy val referenceSpec = DemoSpec
  lazy val programInfo = Spec.Info("demo", "Usage: demo [<options>]", "scala.tools.cmd.Demo")

  help("""Usage: demo [<options>]""")
  heading("Unary options:")

  val optIsUnary = "unary" / "a unary option" --? ;
  ("action" / "a body which may be run") --> println("Hello, I am the --action body.")

  heading("Binary options:")
  val optopt = "str" / "an optional String" --|
  val optoptInt = ("int" / "an optional Int") . --^[Int]
  val optEnv = "defenv" / "an optional String" defaultToEnv "PATH"
  val optDefault = "defstr" / "an optional String" defaultTo "default"
  val optDefaultInt = "defint" / "an optional Int" defaultTo -1
  val optExpand = "alias" / "an option which expands" expandTo ("--int", "15")
}

object DemoSpec extends DemoSpec with Property {
  lazy val propMapper = new PropertyMapper(DemoSpec)

  type ThisCommandLine = SpecCommandLine
  def creator(args: List[String]) =
    new SpecCommandLine(args) {
      override def errorFn(msg: String) = { println("Error: " + msg) ; sys.exit(0) }
    }
}

class Demo(args: List[String]) extends {
  val parsed = DemoSpec(args: _*)
} with DemoSpec with Instance {
  import java.lang.reflect._

  def helpMsg = DemoSpec.helpMsg
  def demoSpecMethods = this.getClass.getMethods.toList
  private def isDemo(m: Method) = (m.getName startsWith "opt") && !(m.getName contains "$") && (m.getParameterTypes.isEmpty)

  def demoString(ms: List[Method]) = {
    val longest = ms map (_.getName.length) max
    val formatStr = " %-" + longest + "s: %s"
    val xs = ms map (m => formatStr.format(m.getName, m.invoke(this)))

    xs mkString ("Demo(\n ", "\n ", "\n)\n")
  }

  override def toString = demoString(demoSpecMethods filter isDemo)
}

object Demo {
  def main(args: Array[String]): Unit = {
    val runner = new Demo(args.toList)

    if (args.isEmpty)
      println(runner.helpMsg)

    println(runner)
  }
}
Something went wrong with that request. Please try again.