Support standard Preserves text encoding as well as JSON

This commit is contained in:
Emery Hemingway 2023-10-21 15:48:39 +01:00
parent 8362a09ec0
commit edece399be
6 changed files with 43 additions and 24 deletions

3
.gitignore vendored
View File

@ -1,2 +1,3 @@
/nim.cfg /nim.cfg
/tests/*.run *.html
*.run

0
.gitmodules vendored
View File

View File

@ -1,6 +1,6 @@
# Package # Package
version = "20231020" version = "20231021"
author = "Emery Hemingway" author = "Emery Hemingway"
description = "data model and serialization format" description = "data model and serialization format"
license = "Unlicense" license = "Unlicense"

View File

@ -1392,7 +1392,9 @@ proc getOrDefault*[T, V](pr: Preserve[T]; key: string; default: V): V =
else: break else: break
default 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. ## Encode Preserves to a `Stream` as text.
if pr.embedded: write(stream, "#!") if pr.embedded: write(stream, "#!")
case pr.kind: case pr.kind:
@ -1456,36 +1458,52 @@ proc writeText*[E](stream: Stream; pr: Preserve[E]) =
of pkRecord: of pkRecord:
assert(pr.record.len > 0) assert(pr.record.len > 0)
write(stream, '<') write(stream, '<')
writeText(stream, pr.record[pr.record.high]) writeText(stream, pr.record[pr.record.high], mode)
for i in 0..<pr.record.high: for i in 0..<pr.record.high:
write(stream, ' ') write(stream, ' ')
writeText(stream, pr.record[i]) writeText(stream, pr.record[i], mode)
write(stream, '>') write(stream, '>')
of pkSequence: of pkSequence:
write(stream, '[') write(stream, '[')
var insertComma: bool var insertSeperator: bool
for val in pr.sequence: case mode
if insertComma: write(stream, ',') of textPreserves:
else: insertComma = true for val in pr.sequence:
writeText(stream, val) 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, ']') write(stream, ']')
of pkSet: of pkSet:
write(stream, "#{") write(stream, "#{")
var insertWhitespace: bool var insertSeperator: bool
for val in pr.set.items: for val in pr.set.items:
if insertWhitespace: write(stream, ' ') if insertSeperator: write(stream, ' ')
else: insertWhitespace = true else: insertSeperator = true
writeText(stream, val) writeText(stream, val, mode)
write(stream, '}') write(stream, '}')
of pkDictionary: of pkDictionary:
write(stream, '{') write(stream, '{')
var insertComma: bool var insertSeperator: bool
for (key, value) in pr.dict.items: case mode
if insertComma: write(stream, ',') of textPreserves:
else: insertComma = true for (key, value) in pr.dict.items:
writeText(stream, key) if insertSeperator: write(stream, ' ')
write(stream, ":") else: insertSeperator = true
writeText(stream, value) 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, '}') write(stream, '}')
of pkEmbedded: of pkEmbedded:
write(stream, "#!") write(stream, "#!")
@ -1497,7 +1515,7 @@ proc writeText*[E](stream: Stream; pr: Preserve[E]) =
proc `$`*[E](pr: Preserve[E]): string = proc `$`*[E](pr: Preserve[E]): string =
## Generate the textual representation of ``pr``. ## Generate the textual representation of ``pr``.
var stream = newStringStream() var stream = newStringStream()
writeText(stream, pr) writeText(stream, pr, textPreserves)
result = move stream.data result = move stream.data
include ./preserves/private/parse include ./preserves/private/parse

View File

@ -300,4 +300,4 @@ when isMainModule:
let let
scm = parsePreservesSchema(txt) scm = parsePreservesSchema(txt)
pr = toPreserve scm pr = toPreserve scm
stdout.newFileStream.writeText pr stdout.newFileStream.writeText(pr, textPreserves)

View File

@ -1,2 +1,2 @@
include_rules include_rules
: foreach t*.nim |> !nim_run |> : foreach t*.nim |> !nim_run |> | ../<test>