Extract properties block parser to file

This commit is contained in:
Florian Schroedl
2022-01-20 17:00:00 +01:00
parent cad191a976
commit 21a6234149
5 changed files with 131 additions and 88 deletions

View File

@@ -0,0 +1,59 @@
import std/sugar
import std/strformat
import std/collections/sequtils
import std/strutils
import results
import fusion/matching
import ../utils/fp
import ../parser/parser
import ../parser/utils
{.experimental: "caseStmtMacros".}
let propertiesKeyParser* = ignore(ch(':')) + anyUntil(choice(@[str(": "), newline]))
let propertiesValueParser* = ignore(str(": ")) + anyUntil(newline) + ignore(newline)
let propertiesParser* = proc(parser: Parser): ParserResult {.closure.} =
let keyTokenParser = parser
.propertiesKeyParser()
.flatMap(flattenParserTokens)
let valueTokenParser = keyTokenParser
.map(emptyTokens)
.flatMap(propertiesValueParser)
.flatMap(flattenParserTokens)
case (keyTokenParser, valueTokenParser):
of (Some(@key), Some(@value)):
ok(Parser(
state: value.state,
tokens: @[
key.tokens[0],
value.tokens[0],
]
))
else: valueTokenParser
let propertiesStartParser* = str(":PROPERTIES_START:") + newline
let propertiesEndParser* = str(":PROPERTIES_END:") + newline
let parseProperties* = @[
ignore(propertiesStartParser),
manyUntil(
propertiesParser,
propertiesEndParser,
),
ignore(propertiesEndParser),
]
when isMainModule:
let example = initParserResult(""":PROPERTIES:
:PROP_NAME: Value
:PROP_NAME: Value
:PROP_NAME: Value
:PROP_NAME: Value
:PROPERTIES_END:""").parseSeq(parseProperties)
echo example