Test choice

This commit is contained in:
Florian Schroedl
2022-08-26 17:09:42 +02:00
parent 2ee602c0b3
commit a9ce7f2963

View File

@@ -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