Support standard Preserves text encoding as well as JSON
This commit is contained in:
parent
8362a09ec0
commit
edece399be
|
@ -1,2 +1,3 @@
|
||||||
/nim.cfg
|
/nim.cfg
|
||||||
/tests/*.run
|
*.html
|
||||||
|
*.run
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
include_rules
|
include_rules
|
||||||
: foreach t*.nim |> !nim_run |>
|
: foreach t*.nim |> !nim_run |> | ../<test>
|
||||||
|
|
Loading…
Reference in New Issue