# SPDX-FileCopyrightText: ☭ Emery Hemingway # SPDX-License-Identifier: Unlicense import std/[asyncdispatch, asyncnet, json] from std/nativesockets import AF_UNIX, SOCK_STREAM, Protocol import preserves, preserves/jsonhooks, syndicate, syndicate/patterns import ./schema/config runActor("main") do (root: Ref; turn: var Turn): connectStdio(root, turn) during(turn, root, ?JsonSocketTranslatorArguments) do (ds: Ref, socketPath: string): let socket = newAsyncSocket( domain = AF_UNIX, sockType = SOCK_STREAM, protocol = cast[Protocol](0), buffered = false, ) addCallback(connectUnix(socket, socketPath), turn) do (turn: var Turn): let a = JsonTranslatorConnected(path: socketPath) discard publish(turn, ds, a) let socketFacet = turn.facet proc processOutput(fut: Future[string]) {.gcsafe.} = run(socketFacet) do (turn: var Turn): var data = fut.read.parseJson.toPreserve message(turn, ds, initRecord("recv-json", data)) socket.recvLine.addCallback(processOutput) socket.recvLine.addCallback(processOutput) onMessage(turn, ds, ?Input) do (data: Assertion): var js: JsonNode if fromPreserve(js, data): asyncCheck(turn, send(socket, $js & "\n")) else: writeLine(stderr, "cannot convert assertion to JSON - ", data) do: close(socket)