# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense import std/[os, tables] import preserves import syndicate, syndicate/[durings, relays] proc parsePattern(pr: Assertion): Pattern = let dropSigil = initRecord("lit", "_".toSymbol(Cap)) grabSigil = initRecord("lit", "?".toSymbol(Cap)) var pr = grab(pr).toPreserve(Cap) apply(pr) do (pr: var Assertion): if pr == dropSigil: pr = initRecord[Cap]("_") elif pr == grabSigil: pr = initRecord("bind", initRecord[Cap]("_")) doAssert result.fromPreserve(pr) proc inputPattern: Pattern = var args = commandLineParams() if args.len != 1 or args == @[""]: quit "expected a single pattern argument" else: var pr: Assertion input = pop args try: pr = parsePreserves(input, Cap) except ValueError: quit "failed to parse Preserves argument" result = parsePattern(pr) type DumpEntity {.final.} = ref object of Entity assertions: Table[Handle, seq[Assertion]] proc toLine(values: seq[Assertion]; prefix: char): string = result = newStringOfCap(1024) let sep = getEnv("FS", " ") result.add(prefix) for v in values: add(result, sep) add(result, $v) add(result, '\n') method publish(dump: DumpEntity; turn: var Turn; ass: AssertionRef; h: Handle) = var values = ass.value.sequence stdout.write(values.toLine('+')) stdout.flushFile() dump.assertions[h] = values method retract(dump: DumpEntity; turn: var Turn; h: Handle) = var values: seq[Assertion] if dump.assertions.pop(h, values): stdout.write(values.toLine('-')) stdout.flushFile() method message*(dump: DumpEntity; turn: var Turn; ass: AssertionRef) = stdout.write(ass.value.sequence.toLine('!')) stdout.flushFile() proc exitProc() {.noconv.} = stdout.write('\n') quit() proc main = let route = envRoute() pat = inputPattern() entity = DumpEntity() runActor("syndex_card") do (root: Cap; turn: var Turn): discard observe(turn, root, pat, entity) resolve(turn, root, route) do (turn: var Turn; ds: Cap): discard observe(turn, ds, pat, entity) setControlCHook(exitProc) main()