Support standard Preserves text encoding as well as JSON
This commit is contained in:
parent
8362a09ec0
commit
edece399be
|
@ -1,2 +1,3 @@
|
|||
/nim.cfg
|
||||
/tests/*.run
|
||||
*.html
|
||||
*.run
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
# Package
|
||||
|
||||
version = "20231020"
|
||||
version = "20231021"
|
||||
author = "Emery Hemingway"
|
||||
description = "data model and serialization format"
|
||||
license = "Unlicense"
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -300,4 +300,4 @@ when isMainModule:
|
|||
let
|
||||
scm = parsePreservesSchema(txt)
|
||||
pr = toPreserve scm
|
||||
stdout.newFileStream.writeText pr
|
||||
stdout.newFileStream.writeText(pr, textPreserves)
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
include_rules
|
||||
: foreach t*.nim |> !nim_run |>
|
||||
: foreach t*.nim |> !nim_run |> | ../<test>
|
||||
|
|
Loading…
Reference in New Issue