39 lines
1.4 KiB
Nim
39 lines
1.4 KiB
Nim
# 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)
|