vantage_dataset/im/
dataset_insertable.rs1use 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 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 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 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