# 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..", 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".}