scopt 4.0.0 は以下のビルドマトリックスに対してクロスパブリッシュされている:
Scala |
JVM |
JS (1.x) |
JS (0.6.x) |
Native (0.4.0-M2) |
Native (0.3.x) |
3.0.0-M2 |
✅ |
✅ |
n/a |
n/a |
n/a |
3.0.0-M1 |
✅ |
✅ |
n/a |
n/a |
n/a |
2.13.x |
✅ |
✅ |
✅ |
n/a |
n/a |
2.12.x |
✅ |
✅ |
✅ |
n/a |
n/a |
2.11.x |
✅ |
✅ |
✅ |
✅ |
✅ |
scopt 4 における関数型 DSL は以下のようになる:
import scopt.OParser
val builder = OParser.builder[Config]
val parser1 = {
import builder._
OParser.sequence(
programName("scopt"),
head("scopt", "4.x"),
// option -f, --foo
opt[Int]('f', "foo")
.action((x, c) => c.copy(foo = x))
.text("foo is an integer property"),
// more options here...
)
}
// OParser.parse returns Option[Config]
OParser.parse(parser1, args, Config()) match {
case Some(config) =>
// do something
case _ =>
// arguments are bad, error message will have been displayed
}
OptionParser
内でメソッドを呼ぶのではなく、関数型 DSL はまず特定の Config
データ型に対するビルダーを作って、opt[A](...)
など Oparser[A, Config]
を返す関数を呼ぶ。
これらの OParser[A, Config]
パーサーは OParser.sequence(...)
を用いて合成できる。
最初は for
内包表記を使ってこの合成を表すことも考えていたが、その見た目に慣れて人にとっては分かりづらいと思ったので sequence
関数を作った。