use std::collections::HashMap;
use plexus_engine::{EntityRef, StorageAdapter, Value};
#[derive(Debug, thiserror::Error)]
enum AdapterError {
#[error("entity not found")]
NotFound,
}
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();
}