diff --git a/src/org/org_text_delimiter.nim b/src/org/org_text_delimiter.nim index 1dd67b7..d78c78f 100644 --- a/src/org/org_text_delimiter.nim +++ b/src/org/org_text_delimiter.nim @@ -1,5 +1,7 @@ import std/sugar import std/collections/sequtils +import std/strformat +import std/strutils import results import fusion/matching import ./org_types @@ -40,7 +42,7 @@ type OrgBuilderT* = OrgElement type OrgBuilder* = Builder[OrgBuilderT] type OrgBuilderResult* = BuilderResult[OrgBuilderT] -proc makeBoldTokens*(content: string): OrgBuilderT = +proc makeBoldToken*(content: string): OrgBuilderT = OrgBuilderT( kind: orgBoldText, content: content, @@ -50,7 +52,7 @@ proc makeOrgToken*(orgTokenFn: string -> OrgBuilderT): (seq[ParserToken], seq[Or return proc(parserTokens: seq[ParserToken], builderTokens: seq[OrgBuilderT]): seq[OrgBuilderT] = return builderTokens & parserTokens.foldl(a & b.tokenStringValue(), "").orgTokenFn() -proc textParser[T]( +proc parseText[T]( builder: Builder[T], builderFns: seq[tuple[ parserFn: Parser -> ParserResult, @@ -60,10 +62,10 @@ proc textParser[T]( ): BuilderResult[T] = let (parser, tree) = builder - var parserAcc: ParserResult = parser.ok() - var builderAcc: Builder = builder + var parserAcc: ParserResult = ParserResult.ok(parser) + var builderAcc: Builder[T] = builder - while parser.isOk() and parserAcc.flatMap(stopFn).isErr(): + while parserAcc.isOk() and parserAcc.flatMap(stopFn).isErr(): # Empty the parser tokens as we want to seperate them for the next parser in the sequence let emptyParser = parserAcc.map(emptyTokens) @@ -87,3 +89,23 @@ proc textParser[T]( if not found: parserAcc = parserAcc.flatMap(anyCh) + + BuilderResult[T].ok(builderAcc) + +when isMainModule: + let foo = OrgBuilderResult.ok(OrgBuilder(( + parser: initParser("Just *some* text"), + tree: newSeq[OrgBuilderT](), + ))) + .flatMap((builder: OrgBuilder) => parseText( + builder = builder, + builderFns = @[ + (boldParser, makeOrgToken(makeBoldToken)), + ] + )) + # .foldBuilder( + # err => &"Error Parsing: {err}", + # xs => $xs + # ) + + echo foo diff --git a/src/org/org_types.nim b/src/org/org_types.nim index e38ce6b..19e8715 100644 --- a/src/org/org_types.nim +++ b/src/org/org_types.nim @@ -1,3 +1,5 @@ +import std/strformat + type orgElementKind* = enum orgRawText, @@ -11,3 +13,15 @@ type of orgRawText: discard of orgText: discard of orgBoldText: discard + +proc `$`*(x: orgElementKind): string = + case x: + of orgRawText: "Text (Raw)" + of orgText: "Text" + of orgBoldText: "Text (Bold)" + +proc `$`*(x: OrgElement): string = + &"""OrgElement( + content: {x.content} + kind: {x.kind} +)"""