plexus-engine 0.3.4

Engine integration traits for consuming Plexus plans
Documentation
use std::collections::HashMap;

use plexus_engine::{EntityRef, StorageAdapter, Value};

#[derive(Debug, thiserror::Error)]
enum AdapterError {
    #[error("entity not found")]
    NotFound,
}

/// Minimal persistent-mapping sketch for engine implementers.
/// Uses in-memory maps to model a storage backend handle table.
struct ExampleAdapter {
    id_map: HashMap<(u8, u64), u64>,
    props: HashMap<(u64, String), Value>,
}

impl ExampleAdapter {
    fn new() -> Self {
        Self {
            id_map: HashMap::new(),
            props: HashMap::new(),
        }
    }

    fn entity_key(entity: EntityRef) -> (u8, u64) {
        match entity {
            EntityRef::Node(id) => (0, id),
            EntityRef::Rel(id) => (1, id),
        }
    }
}

impl StorageAdapter for ExampleAdapter {
    type Error = AdapterError;

    fn resolve(&self, entity: EntityRef) -> Result<Option<u64>, Self::Error> {
        Ok(self.id_map.get(&Self::entity_key(entity)).copied())
    }

    fn get_property(&self, entity: EntityRef, key: &str) -> Result<Value, Self::Error> {
        let Some(handle) = self.resolve(entity)? else {
            return Err(AdapterError::NotFound);
        };
        Ok(self
            .props
            .get(&(handle, key.to_string()))
            .cloned()
            .unwrap_or(Value::Null))
    }

    fn set_property(
        &mut self,
        entity: EntityRef,
        key: &str,
        value: Value,
    ) -> Result<(), Self::Error> {
        let Some(handle) = self.resolve(entity)? else {
            return Err(AdapterError::NotFound);
        };
        self.props.insert((handle, key.to_string()), value);
        Ok(())
    }

    fn remove_property(&mut self, entity: EntityRef, key: &str) -> Result<(), Self::Error> {
        let Some(handle) = self.resolve(entity)? else {
            return Err(AdapterError::NotFound);
        };
        let _ = self.props.remove(&(handle, key.to_string()));
        Ok(())
    }
}

fn main() {
    let _adapter = ExampleAdapter::new();
}