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
/tests/*.run
*.html
*.run

0
.gitmodules vendored
View File

View File

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

View File

@ -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..<pr.record.high:
write(stream, ' ')
writeText(stream, pr.record[i])
writeText(stream, pr.record[i], mode)
write(stream, '>')
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

View File

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

View File

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