Skip to main content

kmp_adapter_embedded/adapter/
node_detail.rs

1use kmp_domain::{NodeDetailProjection, NodeDetailReader, PortError};
2
3use super::engine::{Key, Table};
4use super::serdes::{DetailRecord, decode};
5use super::store::EmbeddedKernelStore;
6
7impl NodeDetailReader for EmbeddedKernelStore {
8    async fn load_node_detail(
9        &self,
10        node_id: &str,
11    ) -> Result<Option<NodeDetailProjection>, PortError> {
12        let node_id = node_id.to_string();
13        self.run(move |store| {
14            let tx = store.begin_read()?;
15            match tx.get(Table::Details, Key::Str(&node_id))? {
16                Some(raw) => Ok(Some(decode::<DetailRecord>("node detail", &raw)?.into())),
17                None => Ok(None),
18            }
19        })
20        .await
21    }
22
23    async fn load_node_details_batch(
24        &self,
25        node_ids: Vec<String>,
26    ) -> Result<Vec<Option<NodeDetailProjection>>, PortError> {
27        self.run(move |store| {
28            let tx = store.begin_read()?;
29            let mut results = Vec::with_capacity(node_ids.len());
30            for node_id in &node_ids {
31                results.push(match tx.get(Table::Details, Key::Str(node_id))? {
32                    Some(raw) => Some(decode::<DetailRecord>("node detail", &raw)?.into()),
33                    None => None,
34                });
35            }
36            Ok(results)
37        })
38        .await
39    }
40}