syndicated-open/src/common.nim

49 lines
1.7 KiB
Nim

# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/uri
import preserves
proc toPreserveOrNull(s: string; E: typedesc): Preserve[E] =
if s != "": result = toPreserve(s, E)
proc toPreserveHook*(u: Uri; E: typedesc): Preserve[E] =
## Best-effort preservation of the `Uri` type.
runnableExamples:
from std/unittest import check
import std/uri
import preserves
var u = parseUri"https://bidstonobservatory.org"
check $(u.toPreserve) == """<uri "https" [#f #f "bidstonobservatory.org" #f] #f #f #f>"""
initRecord("uri",
u.scheme.toPreserve(E),
toPreserve([
u.username.toPreserveOrNull(E),
u.password.toPreserveOrNull(E),
u.hostname.toPreserveOrNull(E),
u.port.toPreserveOrNull(E),
]),
u.path.toPreserveOrNull(E),
u.query.toPreserveOrNull(E),
u.anchor.toPreserveOrNull(E),
)
proc fromPreserveHook*[E](u: var Uri; pr: Preserve[E]): bool =
## Best-effort preservation of the `Uri` type.
runnableExamples:
import std/uri
import preserves
var u: Uri
doAssert fromPreserveHook(u, parsePreserves"""<uri "https" [#f #f "bidstonobservatory.org" #f] #f #f #f>""")
if pr.isRecord("uri", 5):
result = fromPreserve(u.scheme, pr[0])
if result:
if pr[1].isSequence and pr[1].sequence.len == 4:
discard fromPreserve(u.username, pr[1][0])
discard fromPreserve(u.password, pr[1][1])
discard fromPreserve(u.hostname, pr[1][2])
discard fromPreserve(u.port, pr[1][3])
discard fromPreserve(u.path, pr[2])
discard fromPreserve(u.query, pr[3])
discard fromPreserve(u.anchor, pr[4])