Skip to main content

vantage_dataset/im/
dataset_insertable.rs

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