Skip to main content

vantage_dataset/im/
dataset_insertable.rs

1use async_trait::async_trait;
2use vantage_types::{Entity, Record, TryIntoRecord};
3
4use crate::{im::ImTable, traits::InsertableDataSet};
5
6#[async_trait]
7impl<E> InsertableDataSet<E> for ImTable<E>
8where
9    E: Entity,
10    <E as TryIntoRecord<serde_json::Value>>::Error: std::fmt::Debug,
11{
12    async fn insert_return_id(&self, entity: &E) -> crate::traits::Result<Self::Id> {
13        // Convert entity to record
14        let mut record: Record<serde_json::Value> =
15            entity.clone().try_into_record().map_err(|e| {
16                vantage_core::util::error::vantage_error!(
17                    "Failed to serialize entity to record: {:?}",
18                    e
19                )
20            })?;
21
22        // Extract ID from record if present, otherwise generate random ID
23        let id = if let Some(record_id) = record.get("id") {
24            if record_id.is_null() {
25                self.generate_id()
26            } else if let Some(id_str) = record_id.as_str() {
27                if id_str.is_empty() {
28                    self.generate_id()
29                } else {
30                    id_str.to_string()
31                }
32            } else if let Some(id_num) = record_id.as_u64() {
33                id_num.to_string()
34            } else {
35                self.generate_id()
36            }
37        } else {
38            self.generate_id()
39        };
40
41        // Remove id from the stored record since it's in the key
42        record.shift_remove("id");
43
44        self.data_source
45            .with_table_mut(&self.table_name, |table| table.insert(id.clone(), record));
46
47        Ok(id)
48    }
49}
50
51// Tests are in tests/im_dataset.rs integration tests