Search code examples
scalascopt

scopt3 sample script does not compile


I'm trying to use scopt3 in my project but I get compilation errors even for the sample code on scopt3 Github page:

val parser = new scopt.OptionParser[Config]("scopt") {
  head("scopt", "3.x")
  opt[Int]('f', "foo") action { (x, c) =>
    c.copy(foo = x) } text("foo is an integer property")
  opt[File]('o', "out") required() valueName("<file>") action { (x, c) =>
    c.copy(out = x) } text("out is a required file property")
  opt[(String, Int)]("max") action { case ((k, v), c) =>
    c.copy(libName = k, maxCount = v) } validate { x =>
    if (x._2 > 0) success else failure("Value <max> must be >0") 
  } keyValueName("<libname>", "<max>") text("maximum count for <libname>")
  opt[Seq[File]]('j', "jars") valueName("<jar1>,<jar2>...") action { (x,c) =>
    c.copy(jars = x) } text("jars to include")
  opt[Map[String,String]]("kwargs") valueName("k1=v1,k2=v2...") action { (x, c) =>
    c.copy(kwargs = x) } text("other arguments")
  opt[Unit]("verbose") action { (_, c) =>
    c.copy(verbose = true) } text("verbose is a flag")
  opt[Unit]("debug") hidden() action { (_, c) =>
    c.copy(debug = true) } text("this option is hidden in the usage text")
  note("some notes.\n")
  help("help") text("prints this usage text")
  arg[File]("<file>...") unbounded() optional() action { (x, c) =>
    c.copy(files = c.files :+ x) } text("optional unbounded args")
  cmd("update") action { (_, c) =>
    c.copy(mode = "update") } text("update is a command.") children(
    opt[Unit]("not-keepalive") abbr("nk") action { (_, c) =>
      c.copy(keepalive = false) } text("disable keepalive"),
    opt[Boolean]("xyz") action { (x, c) =>
      c.copy(xyz = x) } text("xyz is a boolean property"),
    checkConfig { c =>
      if (c.keepalive && c.xyz) failure("xyz cannot keep alive") else success }
  )
}

errors are:

1) not found type Config
I thougth it was com.typesafe.config.Config, but when I import I get "velue copy is not a member of com.typesafe.config.Config". Where does Config come from?

2) not found value foo
All arguments to .copy() method are marked as "not found values" (I suppose is due to the previous error on Config)

I'm on scala 2.11.6 / SBT 0.13.8

Any help?


Solution

  • scopt has nothing to do with typesafe-config at all.

    If you carefully read the README, you will notice that Config is defined right before the code you paste here:

    case class Config(foo: Int = -1, out: File = new File("."), xyz: Boolean = false,
      libName: String = "", maxCount: Int = -1, verbose: Boolean = false, debug: Boolean = false,
      mode: String = "", files: Seq[File] = Seq(), keepalive: Boolean = false,
      jars: Seq[File] = Seq(), kwargs: Map[String,String] = Map())
    

    It is merely an example of an object that holds all parameters of a program.

    The idea is you parametrise OptionParser with any configuration object you wish. E.g.

    case class Foo(name: String)
    
    val parser = new scopt.OptionParser[Foo]("foo") {
      opt[String]('n', "name") action { (n, foo) => foo.copy(name = n) }
    }
    val res = parser.parse(args, Foo("default"))