dataloom-db-core 0.9.1

A database abstraction layer
Documentation
use itertools::Itertools;

use crate::{column::ColumnType, save::SaveModel, traits::model::Model};

pub trait SaveData {
    /// This function should return all columns and values which were defined by get_migration()
    fn get_save_data(&self) -> Vec<SaveModel>;
}

pub trait ValidateSaveData {
    /// This function checks if all columns are used in the save_data
    fn validate_save_data(&self) -> Option<Vec<String>>;
}

impl<T> ValidateSaveData for T
where
    T: SaveData + Model,
{
    /// This function checks if all columns are used in the save_data
    fn validate_save_data(&self) -> Option<Vec<String>> {
        let cols = Self::get_columns();

        {
            let mut id_exists = false;
            for (name, col_type, _) in cols.iter() {
                if name == self.get_id_column_name() && *col_type == ColumnType::Integer {
                    id_exists = true;
                    break;
                }
            }

            if !id_exists {
                return Some(["id (Integer)"].iter().map(|e| e.to_string()).collect_vec());
            }
        }

        let save_data = self.get_save_data();

        let mut missing_save_data = Vec::new();

        for (name, c_type, _) in cols {
            if !save_data.iter().any(|model| model.key == name) {
                missing_save_data.push(format!("{name} {c_type:?}"));
            }
        }

        if missing_save_data.is_empty() {
            None
        } else {
            Some(missing_save_data)
        }
    }
}