vantage-dataset 0.6.2

Dataset traits for the Vantage data framework
Documentation
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> {
        // Convert entity to record
        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
                )
            })?;

        // Extract ID from record if present, otherwise generate random ID
        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()
        };

        // Remove id from the stored record since it's in the key
        record.shift_remove("id");

        self.data_source
            .with_table_mut(&self.table_name, |table| table.insert(id.clone(), record));

        Ok(id)
    }
}

// Tests are in tests/im_dataset.rs integration tests