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. ## Needs at least one character match.
manyUntil(anyCh, stopFn) 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.} = return proc(parser: Parser): ParserResult {.closure.} =
var errors: seq[ParserResult] = newSeq[ParserResult]() var errors: seq[ParserResult] = newSeq[ParserResult]()
var found = Nothing[ParserResult]() var found = Nothing[ParserResult]()
for fn in parsers: for fn in parserFns:
let fnResult: ParserResult = fn(parser) let fnResult: ParserResult = fn(parser)
if fnResult.isOk(): if fnResult.isOk():
@@ -229,6 +231,7 @@ let parseBetweenPair* = proc(delimiterParser: parserFnT): parserFnT {.closure.}
when isMainModule: when isMainModule:
let testParser123 = initParserResult("123") let testParser123 = initParserResult("123")
let testAbc1Parser = initParserResult("abc1")
block testParsingFunctions: block testParsingFunctions:
let ch1 = ch('1') let ch1 = ch('1')
@@ -263,7 +266,11 @@ when isMainModule:
assert testParser123.flatMap(ignore(ch('1'))).tokensToString() == "" assert testParser123.flatMap(ignore(ch('1'))).tokensToString() == ""
# manyUntil # manyUntil
assert initParserResult("abc1").flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc" assert testAbc1Parser.flatMap(manyUntil(anyCh, digit)).tokensToString() == "abc"
# anyUntil # 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