Skip to main content

vantage_dataset/im/
dataset_readable.rs

1use 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            // Add the id field to the record for conversion
27            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            // Add the id field to the record for conversion
59            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// Tests are in tests/im_dataset.rs integration tests