2016-10-06 7 views
4

SBTパーサ(http://www.scala-sbt.org/0.13/docs/Parsing-Input.html)を使用してsbt InputTaskのコマンドライン引数を解析しようとしていますが、次の擬似文字に一致するパーサを書き込めません-regex:オプションの空白で囲まれた文字列をSBTパーサと一致させる方法

\w+(-n|--dry-run)\w+ 

これは私が考えることができる最も賢明な表現方法です。入力文字列が一致する場合、結果はSome(true)になります。

import sbt.complete.Parser 
import sbt.complete.DefaultParsers._ 

val dryRunOptions: Parser[String] = OptSpace ~> ("-n" | "--dry-run") <~ OptSpace 
val dryRunParser: Parser[Boolean] = flag(dryRunOptions) 

Parser(dryRunParser)("-n").result 
Parser(dryRunParser)(" -n").result 
Parser(dryRunParser)("-n ").result 
Parser(dryRunParser)(" -n ").result 

Parser(dryRunParser)("--dry-run").result 
Parser(dryRunParser)(" --dry-run").result 
Parser(dryRunParser)("--dry-run ").result 
Parser(dryRunParser)(" --dry-run ").result 

残念ながら、これはこれらのケースと一致しません。

res0: Option[Boolean] = None 
res1: Option[Boolean] = None 
res2: Option[Boolean] = None 
res3: Option[Boolean] = None 

res4: Option[Boolean] = None 
res5: Option[Boolean] = None 
res6: Option[Boolean] = None 
res7: Option[Boolean] = None 

私は、これがこの上のバリエーションのカップルといくつかの例が、決してそれらのすべてを一致させるために得ることができます。どんな助けにも感謝!

答えて

0

誤った方法でパーサーの正しさをチェックしています。この場合、.resultではなく.resultEmpty.isValidを使用する必要があります(tests hereなど)。そして、あなたのコードが正常に動作することを発生します。

import sbt.complete.Parser 
import sbt.complete.DefaultParsers._ 

val dryRunOptions: Parser[String] = OptSpace ~> ("-n" | "--dry-run") <~ OptSpace 
val dryRunParser: Parser[Boolean] = flag(dryRunOptions) 

val test = Seq("-n", " -n", "-n ", " -n ", 
    "--dry-run", " --dry-run", "--dry-run ", " --dry-run ") 

test.foldLeft(true)((b:Boolean, input:String) => 
    b && Parser(dryRunParser)(input).resultEmpty.isValid) 

そして結果:

res0: Boolean = true 
関連する問題