sleipnirdb 0.0.1

SleipnirDB – Bridging Worlds at Lightning Speed.
Documentation
use std::{collections::HashSet, error::Error, fs::File, hash, io::Write, path::PathBuf, sync::{Arc, Mutex}};

use serde::{de::DeserializeOwned, Serialize};

use crate::database::ExDatabase;

use super::{ExTable, EX_TABLE_EXTENSION};

pub trait DumpExTable<T>
where T: Eq + hash::Hash + Serialize + DeserializeOwned {
    fn dump(&self) -> Result<(), Box<dyn Error>>;

    fn serialize_items(&self) -> Result<Vec<u8>, Box<dyn Error>> ;
    fn deserialize_items(data: Vec<u8>, label: String, database: Arc<ExDatabase>) -> Result<ExTable<T>, Box<dyn Error>>;
}

impl <T: Eq + hash::Hash + Serialize + DeserializeOwned>DumpExTable<T> for ExTable<T> {
    fn dump(&self) -> Result<(), Box<dyn Error>> {
        let mut file = File::create(self.database.path.join(self.label.clone() + EX_TABLE_EXTENSION))?;
        file.write_all(&self.serialize_items()?)?;
        file.flush()?;

        Ok(())
    }

    fn serialize_items(&self) -> Result<Vec<u8>, Box<dyn Error>> {
        Ok(rmp_serde::to_vec(&self.items)?)
    }

    fn deserialize_items(data: Vec<u8>, label: String, database: Arc<ExDatabase>) -> Result<ExTable<T>, Box<dyn Error>> {
        let items = rmp_serde::from_slice::<HashSet<T>>(&data)?;
        Ok(ExTable { label, database, items })
    }
}