nix_actor/src/nix_actor/libnix/libexpr.nim

107 lines
3.0 KiB
Nim

# SPDX-FileCopyrightText: ☭ Emery Hemingway
# SPDX-License-Identifier: Unlicense
import ./stdpuspus, ./store
{.passC: staticExec("pkg-config --cflags nix-expr").}
{.passL: staticExec("pkg-config --libs nix-expr").}
proc parentDir(path: string): string =
var i = path.high
while path[i] != '/': dec(i)
path[0..i]
{.passC: "-I" & parentDir(currentSourcePath).}
type
NixInt* = int64
NixFloat* = float64
ValueKind* {.importcpp: "nix::ValueType", header: "value.hh".} = enum
nThunk,
nInt,
nFloat,
nBool,
nString,
nPath,
nNull,
nAttrs,
nList,
nFunction,
nExternal,
Value* = ValueObj | ValuePtr
ValuePtr* = ptr ValueObj
ValueObj* {.importcpp: "nix::Value", header: "value.hh".} = object
integer*: NixInt
boolean*: bool
string: StringContext
path*: cstring
fpoint*: NixFloat
attrs: Bindings
StringContext = object
s: cstring
Symbol* {.importcpp: "nix::Symbol", header: "symbol-table.hh".} = object
discard
Attr {.importcpp: "nix::Attr", header: "attr-set.hh".} = object
name: Symbol
value: ValuePtr
Bindings = ptr BindginsObj
BindginsObj {.importcpp: "nix::Bindings", header: "attr-set.hh".} = object
discard
proc kind*(val: Value): ValueKind {.importcpp: "#.type()".}
proc showType*(val: Value): StdString {.importcpp.}
proc shallowString*(val: Value): string =
if val.kind != nString:
raise newException(FieldDefect, "Value not an attribute set")
$val.string.s
proc size(bindings: Bindings): csize_t {.importcpp.}
proc `[]`(b: Bindings; i: Natural): Attr {.importcpp: "(*#)[#]".}
iterator pairs*(val: Value): (Symbol, ValuePtr) =
if val.kind != nAttrs:
raise newException(FieldDefect, "Value not an attribute set")
for i in 0..<val.attrs.size():
let attr = val.attrs[i]
yield (attr.name, attr.value)
proc listSize(val: Value): csize_t {.importcpp.}
proc listElems(val: Value): ptr UncheckedArray[ValuePtr] {.importcpp.}
iterator items*(val: Value): ValuePtr =
if val.kind != nList:
raise newException(FieldDefect, "Value not a list")
for i in 0..<val.listSize:
yield val.listElems()[i]
type
ExprObj {.importcpp: "nix::Expr", header: "nixexpr.hh".} = object
discard
Expr* = ptr ExprObj
EvalState* {.importcpp: "std::shared_ptr<nix::EvalState>", header: "eval.hh".} = object
discard
proc newEvalState*(store: Store): EvalState {.
importcpp: "nix::newEvalState(@)", header: "seepuspus.hh", constructor.}
proc parseExprFromString*(state: EvalState; s, basePath: cstring): Expr {.
importcpp: "#->parseExprFromString(@)".}
proc eval*(state: EvalState; expr: Expr; value: var ValueObj) {.
importcpp: "#->eval(@)".}
proc forceValueDeep*(state: EvalState; value: var ValueObj) {.
importcpp: "#->forceValueDeep(@)".}
proc stringView(state: EvalState; sym: Symbol): StringView {.
importcpp: "((std::string_view)#->symbols[#])".}
proc symbolString*(state: EvalState; sym: Symbol): string = $stringView(state, sym)
proc initGC*() {.importcpp: "nix::initGC", header: "eval.hh".}