vantage_dataset/im/
dataset_readable.rs1use async_trait::async_trait;
2use indexmap::IndexMap;
3
4use vantage_types::{Entity, TryFromRecord};
5
6use crate::{
7 im::ImTable,
8 traits::{DataSet, ReadableDataSet, Result},
9};
10use vantage_core::util::error::vantage_error;
11
12#[async_trait]
13impl<E> DataSet<E> for ImTable<E> where E: Entity {}
14
15#[async_trait]
16impl<E> ReadableDataSet<E> for ImTable<E>
17where
18 E: Entity,
19 <E as TryFromRecord<serde_json::Value>>::Error: std::fmt::Debug,
20{
21 async fn list(&self) -> Result<IndexMap<Self::Id, E>> {
22 let table = self.data_source.get_or_create_table(&self.table_name);
23 let mut records = IndexMap::new();
24
25 for (id, record) in table.iter() {
26 let mut record_with_id = record.clone();
28 record_with_id.insert("id".to_string(), serde_json::Value::String(id.clone()));
29
30 let entity: E = E::try_from_record(&record_with_id)
31 .map_err(|e| vantage_error!("Failed to convert record to entity: {:?}", e))?;
32 records.insert(id.clone(), entity);
33 }
34
35 Ok(records)
36 }
37
38 async fn get(&self, id: impl Into<Self::Id> + Send) -> Result<Option<E>> {
39 let id = id.into();
40 let table = self.data_source.get_or_create_table(&self.table_name);
41
42 let Some(record) = table.get(&id) else {
43 return Ok(None);
44 };
45
46 let mut record_with_id = record.clone();
47 record_with_id.insert("id".to_string(), serde_json::Value::String(id.clone()));
48
49 let entity = E::try_from_record(&record_with_id)
50 .map_err(|e| vantage_error!("Failed to convert record to entity: {:?}", e))?;
51 Ok(Some(entity))
52 }
53
54 async fn get_some(&self) -> Result<Option<(Self::Id, E)>> {
55 let table = self.data_source.get_or_create_table(&self.table_name);
56
57 if let Some((id, record)) = table.iter().next() {
58 let mut record_with_id = record.clone();
60 record_with_id.insert("id".to_string(), serde_json::Value::String(id.clone()));
61
62 let entity: E = E::try_from_record(&record_with_id)
63 .map_err(|e| vantage_error!("Failed to convert record to entity: {:?}", e))?;
64 Ok(Some((id.clone(), entity)))
65 } else {
66 Ok(None)
67 }
68 }
69}
70
71