49 lines
1.7 KiB
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])
|