nix_actor/src/nix_actor.nim

84 lines
2.4 KiB
Nim

# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import std/tables
import preserves, syndicate, syndicate/relays
# from syndicate/protocols/dataspace import Observe
import ./nix_actor/[nix_api, nix_api_value]
import ./nix_actor/protocol
type
Value = preserves.Value
NixValue = nix_api.Value
proc toPreserves(state: State; value: NixValue): Value {.gcsafe.} =
var ctx: NixContext
case get_type(ctx, value)
of NIX_TYPE_THUNK: raiseAssert "cannot preserve thunk"
of NIX_TYPE_INT:
result = getInt(ctx, value).toPreserves
of NIX_TYPE_FLOAT:
result = getFloat(ctx, value).toPreserves
of NIX_TYPE_BOOL:
result = getBool(ctx, value).toPreserves
of NIX_TYPE_STRING:
result = ($getString(ctx, value)).toPreserves
of NIX_TYPE_PATH:
result = ($getPathString(ctx, value)).toPreserves
of NIX_TYPE_NULL:
result = initRecord("null")
of NIX_TYPE_ATTRS:
result = initDictionary()
let n = getAttrsSize(ctx, value)
var i: cuint
while i < n:
var (key, val) = get_attr_byidx(ctx, value, state, i)
inc(i)
result[toSymbol($key)] = toPreserves(state, val)
# close(val)
of NIX_TYPE_LIST:
let n = getListSize(ctx, value)
result = initSequence(n)
var i: cuint
while i < n:
var val = getListByIdx(ctx, value, state, i)
result[i] = toPreserves(state, val)
inc(i)
# close(val)
of NIX_TYPE_FUNCTION, NIX_TYPE_EXTERNAL:
raiseAssert "TODO: need a failure type"
type
BootArgs {.preservesDictionary.} = object
dataspace: Cap
proc main() =
initLibexpr()
runActor("nix_actor") do (turn: var Turn):
resolveEnvironment(turn) do (turn: var Turn; root: Cap):
during(turn, root, ?:BootArgs) do (ds: Cap):
let
store = openStore()
state = newState(store)
let pat = ?Observe(pattern: !Eval) ?? {0: grabLit(), 1: grabLit()}
during(turn, ds, pat) do (expr: string, path: string):
var
value: NixValue
ass = Eval(expr: expr, path: path)
try:
value = evalFromString(state, ass.expr, ass.path)
force(state, value)
ass.result = toPreserves(state, value)
discard publish(turn, ds, ass)
except CatchableError as err:
stderr.writeLine "failed to evaluate ", ass.expr, ": ", err.msg
close(value)
do:
close(state)
close(store)
main()