kmp-adapter-embedded 0.1.2

Embedded edition storage adapters: every KMP kernel port on a single local redb file
Documentation
use kmp_domain::{NodeDetailProjection, NodeDetailReader, PortError};

use super::serdes::{DetailRecord, decode};
use super::store::{DETAILS, EmbeddedKernelStore, storage_error, table_error};

impl NodeDetailReader for EmbeddedKernelStore {
    async fn load_node_detail(
        &self,
        node_id: &str,
    ) -> Result<Option<NodeDetailProjection>, PortError> {
        let node_id = node_id.to_string();
        self.run(move |store| {
            let tx = store.begin_read()?;
            let details = tx.open_table(DETAILS).map_err(table_error)?;
            match details.get(node_id.as_str()).map_err(storage_error)? {
                Some(guard) => Ok(Some(
                    decode::<DetailRecord>("node detail", guard.value())?.into(),
                )),
                None => Ok(None),
            }
        })
        .await
    }

    async fn load_node_details_batch(
        &self,
        node_ids: Vec<String>,
    ) -> Result<Vec<Option<NodeDetailProjection>>, PortError> {
        self.run(move |store| {
            let tx = store.begin_read()?;
            let details = tx.open_table(DETAILS).map_err(table_error)?;
            let mut results = Vec::with_capacity(node_ids.len());
            for node_id in &node_ids {
                results.push(
                    match details.get(node_id.as_str()).map_err(storage_error)? {
                        Some(guard) => {
                            Some(decode::<DetailRecord>("node detail", guard.value())?.into())
                        }
                        None => None,
                    },
                );
            }
            Ok(results)
        })
        .await
    }
}