syndicate_utils/src/syndesizer/xml_translator.nim

35 lines
1.3 KiB
Nim
Raw Normal View History

2024-01-20 13:28:36 +00:00
# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/[options, parsexml, xmlparser, xmltree]
2024-04-22 12:49:14 +00:00
import preserves, preserves/sugar, preserves/xmlhooks
2024-01-20 13:28:36 +00:00
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.} =
2024-04-05 13:18:47 +00:00
spawnActor(turn, "xml-translator") do (turn: var Turn):
2024-01-20 13:28:36 +00:00
during(turn, root, ?:XmlTranslatorArguments) do (ds: Cap):
2024-04-22 12:49:14 +00:00
let xmlPat = observePattern(!XmlTranslation, {@[%0]:grab()})
during(turn, ds, xmlPat) do (xs: Literal[string]):
2024-01-20 13:28:36 +00:00
publish(turn, ds, translateXml(xs.value))
2024-04-22 12:49:14 +00:00
let prPat = observePattern(!XmlTranslation, {@[%1]:grab()})
during(turn, ds, prPat) do (pr: Literal[Value]):
2024-01-20 13:28:36 +00:00
publish(turn, ds, translatePreserves(pr.value))
when isMainModule:
import syndicate/relays
2024-04-05 13:18:47 +00:00
runActor("main") do (turn: var Turn):
resolveEnvironment(turn) do (turn: var Turn; ds: Cap):
spawnXmlTranslator(turn, ds)