In this case you want err
, not failure
, since if the first parser in a disjunction fails you'll just move on to the second, which isn't what you want.
The other issue is that ^^
is the equivalent of map
, but you want flatMap
, since err("whatever")
is a Parser[Nothing]
, not a Nothing
. You could use the flatMap
method on Parser
, but in this context it's more idiomatic to use the (completely equivalent) >>
operator:
object TestFail extends JavaTokenParsers {
def test: Parser[String] =
"hello" ~> "world" >> (x => err(s"Can't say hello to the $x!")) |
"hello" ~ ident ^^ { case "hello" ~ id => s"hi, $id" }
}
Or, a little more simply:
object TestFail extends JavaTokenParsers {
def test: Parser[String] =
"hello" ~ "world" ~> err(s"Can't say hello to the world!") |
"hello" ~ ident ^^ { case "hello" ~ id => s"hi, $id" }
}
Either approach should do what you want.