use async_trait::async_trait;
use vantage_types::{Entity, Record, TryIntoRecord};
use crate::{im::ImTable, traits::InsertableDataSet};
#[async_trait]
impl<E> InsertableDataSet<E> for ImTable<E>
where
E: Entity,
<E as TryIntoRecord<serde_json::Value>>::Error: std::fmt::Debug,
{
async fn insert_return_id(&self, entity: &E) -> crate::traits::Result<Self::Id> {
let mut record: Record<serde_json::Value> =
entity.clone().try_into_record().map_err(|e| {
vantage_core::util::error::vantage_error!(
"Failed to serialize entity to record: {:?}",
e
)
})?;
let id = if let Some(record_id) = record.get("id") {
if record_id.is_null() {
self.generate_id()
} else if let Some(id_str) = record_id.as_str() {
if id_str.is_empty() {
self.generate_id()
} else {
id_str.to_string()
}
} else if let Some(id_num) = record_id.as_u64() {
id_num.to_string()
} else {
self.generate_id()
}
} else {
self.generate_id()
};
record.shift_remove("id");
self.data_source
.with_table_mut(&self.table_name, |table| table.insert(id.clone(), record));
Ok(id)
}
}