diff --git a/.gitignore b/.gitignore index 1ef70e3..1a64333 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /nim.cfg -/tests/*.run +*.html +*.run diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e69de29..0000000 diff --git a/preserves.nimble b/preserves.nimble index 22aa19d..4627465 100644 --- a/preserves.nimble +++ b/preserves.nimble @@ -1,6 +1,6 @@ # Package -version = "20231020" +version = "20231021" author = "Emery Hemingway" description = "data model and serialization format" license = "Unlicense" diff --git a/src/preserves.nim b/src/preserves.nim index 7086e7f..9c9d555 100644 --- a/src/preserves.nim +++ b/src/preserves.nim @@ -1392,7 +1392,9 @@ proc getOrDefault*[T, V](pr: Preserve[T]; key: string; default: V): V = else: break default -proc writeText*[E](stream: Stream; pr: Preserve[E]) = +type TextMode* = enum textPreserves, textJson + +proc writeText*[E](stream: Stream; pr: Preserve[E]; mode = textPreserves) = ## Encode Preserves to a `Stream` as text. if pr.embedded: write(stream, "#!") case pr.kind: @@ -1456,36 +1458,52 @@ proc writeText*[E](stream: Stream; pr: Preserve[E]) = of pkRecord: assert(pr.record.len > 0) write(stream, '<') - writeText(stream, pr.record[pr.record.high]) + writeText(stream, pr.record[pr.record.high], mode) for i in 0..') of pkSequence: write(stream, '[') - var insertComma: bool - for val in pr.sequence: - if insertComma: write(stream, ',') - else: insertComma = true - writeText(stream, val) + var insertSeperator: bool + case mode + of textPreserves: + for val in pr.sequence: + if insertSeperator: write(stream, ' ') + else: insertSeperator = true + writeText(stream, val, mode) + of textJson: + for val in pr.sequence: + if insertSeperator: write(stream, ',') + else: insertSeperator = true + writeText(stream, val, mode) write(stream, ']') of pkSet: write(stream, "#{") - var insertWhitespace: bool + var insertSeperator: bool for val in pr.set.items: - if insertWhitespace: write(stream, ' ') - else: insertWhitespace = true - writeText(stream, val) + if insertSeperator: write(stream, ' ') + else: insertSeperator = true + writeText(stream, val, mode) write(stream, '}') of pkDictionary: write(stream, '{') - var insertComma: bool - for (key, value) in pr.dict.items: - if insertComma: write(stream, ',') - else: insertComma = true - writeText(stream, key) - write(stream, ":") - writeText(stream, value) + var insertSeperator: bool + case mode + of textPreserves: + for (key, value) in pr.dict.items: + if insertSeperator: write(stream, ' ') + else: insertSeperator = true + writeText(stream, key, mode) + write(stream, ": ") + writeText(stream, value, mode) + of textJson: + for (key, value) in pr.dict.items: + if insertSeperator: write(stream, ',') + else: insertSeperator = true + writeText(stream, key, mode) + write(stream, ':') + writeText(stream, value, mode) write(stream, '}') of pkEmbedded: write(stream, "#!") @@ -1497,7 +1515,7 @@ proc writeText*[E](stream: Stream; pr: Preserve[E]) = proc `$`*[E](pr: Preserve[E]): string = ## Generate the textual representation of ``pr``. var stream = newStringStream() - writeText(stream, pr) + writeText(stream, pr, textPreserves) result = move stream.data include ./preserves/private/parse diff --git a/src/preserves/schemaparse.nim b/src/preserves/schemaparse.nim index f6d712e..8df9ef8 100644 --- a/src/preserves/schemaparse.nim +++ b/src/preserves/schemaparse.nim @@ -300,4 +300,4 @@ when isMainModule: let scm = parsePreservesSchema(txt) pr = toPreserve scm - stdout.newFileStream.writeText pr + stdout.newFileStream.writeText(pr, textPreserves) diff --git a/tests/Tupfile b/tests/Tupfile index 2ffd362..2cccf49 100644 --- a/tests/Tupfile +++ b/tests/Tupfile @@ -1,2 +1,2 @@ include_rules -: foreach t*.nim |> !nim_run |> +: foreach t*.nim |> !nim_run |> | ../