sleipnirdb 0.0.1

SleipnirDB – Bridging Worlds at Lightning Speed.
Documentation
use std::{error::Error, fs::{create_dir_all, read_dir, remove_dir, remove_file, File}, path::PathBuf, sync::{Arc, Mutex}};

use crate::table::EX_TABLE_EXTENSION;

use super::{tables::ExDatabaseEntry, ExDatabase};

pub trait LoadExDatabase {
    fn load(path: impl Into<String>) -> Result<Arc<ExDatabase>, Box<dyn Error>>;
}

impl LoadExDatabase for ExDatabase {
    fn load(path: impl Into<String>) -> Result<Arc<ExDatabase>, Box<dyn Error>> {
        let path: String = path.into();
        let path: PathBuf = PathBuf::from(path);

        create_dir_all(&path)?;

        let tables = vec![];

        let mut database = ExDatabase { 
            path: path.clone(),
            table_labels: Arc::new(Mutex::new(tables))
        };

        let db_arc = Arc::new(database);

        for dir_entry in read_dir(&path)? {
            let dir_entry = dir_entry?;
            let file_name = dir_entry.file_name().to_string_lossy().to_string();

            if dir_entry.file_type()?.is_file() & file_name.ends_with(EX_TABLE_EXTENSION) {
                db_arc.add_table_label(
                    ExDatabaseEntry {
                        database: db_arc.clone(),
                        label: file_name[0..file_name.len()-EX_TABLE_EXTENSION.len()].to_string(),
                    }
                );
            }
        }

        Ok(db_arc)
    }
}

#[test]
pub fn test_load() {
    const TEST_DB: &str = "test/test_load";

    let database = ExDatabase::load(TEST_DB).unwrap();

    remove_dir(TEST_DB).unwrap();

    assert_eq!(database.path, PathBuf::from(TEST_DB))
}