Test choice
This commit is contained in:
@@ -149,12 +149,14 @@ proc anyUntil*(stopFn: parserFnT): parserFnT {.inline.} =
|
||||
## Needs at least one character match.
|
||||
manyUntil(anyCh, stopFn)
|
||||
|
||||
proc choice*(parsers: seq[parserFnT]): parserFnT {.inline} =
|
||||
proc choice*(parserFns: seq[parserFnT]): parserFnT {.inline} =
|
||||
## Creates parser function that checks any of the `parserFns`.
|
||||
## Needs one match for a `ParserResult.ok`.
|
||||
return proc(parser: Parser): ParserResult {.closure.} =
|
||||
var errors: seq[ParserResult] = newSeq[ParserResult]()
|
||||
var found = Nothing[ParserResult]()
|
||||
|
||||
for fn in parsers:
|
||||
for fn in parserFns:
|
||||
let fnResult: ParserResult = fn(parser)
|
||||
|
||||
if fnResult.isOk():
|
||||
@@ -229,6 +231,7 @@ let parseBetweenPair* = proc(delimiterParser: parserFnT): parserFnT {.closure.}
|
||||
|
||||
when isMainModule:
|
||||
let testParser123 = initParserResult("123")
|
||||
let testAbc1Parser = initParserResult("abc1")
|
||||
|
||||
block testParsingFunctions:
|
||||
let ch1 = ch('1')
|
||||
@@ -263,7 +266,11 @@ when isMainModule:
|
||||
assert testParser123.flatMap(ignore(ch('1'))).tokensToString() == ""
|
||||
|
||||
# manyUntil
|
||||
assert initParserResult("abc1").flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc"
|
||||
assert testAbc1Parser.flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc"
|
||||
|
||||
# anyUntil
|
||||
assert initParserResult("abc1").flatMap(anyUntil(digit)).tokensToString() == "abc"
|
||||
assert testAbc1Parser.flatMap(anyUntil(digit)).tokensToString() == "abc"
|
||||
|
||||
# choice
|
||||
assert testAbc1Parser.flatMap(choice(@[digit, ch('a')])).tokensToString() == "a"
|
||||
assert testAbc1Parser.flatMap(choice(@[digit])).error().kind == choiceMismatchErr
|
||||
|
||||
Reference in New Issue
Block a user