kmp_adapter_embedded/adapter/
node_detail.rs1use 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}