import std/[ options, sequtils, strformat, strutils, sugar, ] const INDENT_SIZE* = 2; func stringifyFields*( xs: seq[tuple[ field: string, value: string, print: bool ]], indent = 0, ): string = xs .filter(x => x.print) .map(x => x.field & ": " & $x.value) .join(",\n") func stringifyBlock*(blockName: string, indent = 0, xs: varargs[string]): string = let fieldIndent = indent + INDENT_SIZE concat( @[&"{blockName}("], @xs.mapIt(it.indent(fieldIndent)), @[")"], ) .join("\n") func stringifySeq*[T](xs: seq[T], stringifyFn: (T) -> string, indent = 0): string = let fieldIndent = indent + INDENT_SIZE @[ "@[", xs .mapIt(it.stringifyFn()) .join(",\n") .indent(fieldIndent), "]", ] .join("\n")