Expand description
External Nix values backed by Rust data.
NixExternal: trait your data type must implement.EvalState::make_external: wraps a value and returns anExternalValueHandle.ExternalValueHandle::as_external: downcasts back to a concrete Rust type.
A TypeId is stored alongside each data pointer.
ExternalValueHandle::as_external checks it before returning a reference,
so a wrong-type downcast returns Error::InvalidType rather than UB.
§Example
use std::sync::Arc;
use nix_bindings::{Context, EvalStateBuilder, Store, external::NixExternal};
struct MyData(i64);
impl NixExternal for MyData {
fn display(&self) -> String {
format!("MyData({})", self.0)
}
fn type_name(&self) -> &'static str {
"MyData"
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let ctx = Arc::new(Context::new()?);
let store = Arc::new(Store::open(&ctx, None)?);
let state = EvalStateBuilder::new(&store)?.build()?;
let handle = state.make_external(MyData(42))?;
let back = handle.as_external::<MyData>()?;
assert_eq!(back.0, 42);
Ok(())
}Structs§
- External
Value Handle - A handle to a Nix external value that retains the
ExternalValue*.
Traits§
- NixExternal
- A Rust type that can be embedded as an external value in the Nix evaluator.