Skip to main content

Module external

Module external 

Source
Expand description

External Nix values backed by Rust data.

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§

ExternalValueHandle
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.