Skip to main content

kmp_adapter_embedded/adapter/
node_detail.rs

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