From 197862569ed7f39053c8c8273a8af4a779fb4f93 Mon Sep 17 00:00:00 2001 From: Florian Schroedl Date: Fri, 26 Aug 2022 22:02:44 +0200 Subject: [PATCH] Basic builder structure --- src_v2/parser/builder_types.nim | 74 ++++++++++++++++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/src_v2/parser/builder_types.nim b/src_v2/parser/builder_types.nim index 208e72b..eca8d1d 100644 --- a/src_v2/parser/builder_types.nim +++ b/src_v2/parser/builder_types.nim @@ -1,7 +1,11 @@ +import std/[ + sugar, +] import fp/[ resultM, ] import ./parser_types +import ./parser_api type Builder*[T] = tuple[ @@ -12,5 +16,73 @@ type parserError BuilderError*[T] = ref object kind*: builderErrorKind - builder*: Builder[T] + parser*: ParserError + tree*: seq[T] BuilderResult*[T] = Result[Builder[T], BuilderError[T]] + +# -- Initalizers + +proc initBuilder*[T](parser: Parser, tree: seq[T]): Builder[T] = + Builder[T](( + parser, + tree + )) + +# -- Modifiers + +proc setParser*[T](builder: Builder[T], parser: Parser): Builder[T] = + Builder[T](( + parser, + builder.tree, + )) + +proc setTree*[T](builder: Builder[T], tree: seq[T]): Builder[T] = + Builder[T](( + builder.parser, + tree, + )) + +proc tryParser*[T]( + builder: Builder[T], + parserFn: parserFnT, +): BuilderResult[T] = + ## Try out a `parser` on a `builder` + ## When successful return the original builder, otherwise return an error + let parser = ParserResult + .ok(Parser( + state: builder.parser.state, + tokens: @[], + )) + .flatMap(parserFn) + + parser + .foldTokens( + (err: ParserError) => BuilderResult[T].err(BuilderError[T]( + kind: parserError, + parser: err, + tree: builder.tree, + )), + (newTokens: seq[ParserToken]) => BuilderResult[T].ok(builder), + ) + +when isMainModule: + type TestStringBuilderT* = string + type TestStringBuilder* = Builder[TestStringBuilderT] + type TestStringBuilderResult* = BuilderResult[TestStringBuilderT] + + let testBuilder123 = initBuilder( + initParser("123"), + newSeq[TestStringBuilderT]() + ) + + block testModifiers: + # setters + assert testBuilder123.setParser(initParser("abc")).parser.state.stream == "abc" + assert testBuilder123.setTree(@["abc"]).tree[0] == "abc" + + # tryParser + assert testBuilder123.tryParser(ch('1')).isOk() == true + assert testBuilder123.tryParser(ch('2')).isErr() == true + + # echo testBuilder123 + # block testModifiers: