34 lines
1.2 KiB
Nim
34 lines
1.2 KiB
Nim
# SPDX-FileCopyrightText: ☭ Emery Hemingway
|
|
# SPDX-License-Identifier: Unlicense
|
|
|
|
import std/[options, parsexml, xmlparser, xmltree]
|
|
import preserves, preserves/xmlhooks
|
|
import syndicate
|
|
|
|
import ../schema/[assertions, config]
|
|
|
|
proc translateXml(s: string): XmlTranslation =
|
|
result.xml = s
|
|
try: result.pr = result.xml.parseXml({allowUnquotedAttribs}).toPreservesHook
|
|
except XmlError: discard
|
|
|
|
proc translatePreserves(pr: Value): XmlTranslation {.gcsafe.} =
|
|
result.pr = pr
|
|
var xn = result.pr.preservesTo(XmlNode)
|
|
if xn.isSome: result.xml = $get(xn)
|
|
|
|
proc spawnXmlTranslator*(turn: var Turn; root: Cap): Actor {.discardable.} =
|
|
spawn("xml-translator", turn) do (turn: var Turn):
|
|
during(turn, root, ?:XmlTranslatorArguments) do (ds: Cap):
|
|
let obsPat = ?Observe(pattern: !XmlTranslation)
|
|
during(turn, ds, obsPat ?? {0: grab()}) do (xs: Literal[string]):
|
|
publish(turn, ds, translateXml(xs.value))
|
|
during(turn, ds, obsPat ?? {1: grab()}) do (pr: Literal[Value]):
|
|
publish(turn, ds, translatePreserves(pr.value))
|
|
|
|
when isMainModule:
|
|
import syndicate/relays
|
|
runActor("main") do (turn: var Turn; root: Cap):
|
|
connectStdio(turn, root)
|
|
spawnXmlTranslator(turn, root)
|