opus-db 0.1.0

test database implementation
Documentation
#[macro_use]
extern crate bitflags;

use std::collections::{HashMap, HashSet};
use std::env;
use std::fs;
use std::io;
use std::path::{Path, PathBuf};
use std::result;

mod attributes;
use crate::attributes::{Attribute, Id};

pub trait database {
    fn new();
    fn create_attribute();
    fn remove_attribute();
    fn update_attribute();
}

pub struct Database {
    base_dir: PathBuf,
    attribute_handler: AttributeHandler,
    user_handler: UserHandler,
}

impl Database {
    fn new() -> Self {
        // Create reference to base directory.
        let mut base_dir = match env::current_dir() {
            Ok(dir) => dir,
            Err(err) => panic!(err),
        };
        // Check to see if database directory already exists.
        //
        // TODO: change base dir `database` string
        base_dir.push("database");
        fs::create_dir(&base_dir).unwrap_or(());

        let attribute_handler = AttributeHandler::new(&base_dir);
        let user_handler = UserHandler::new(&base_dir);

        Database {
            base_dir,
            attribute_handler,
            user_handler,
        }
    }

    #[allow(dead_code)]
    fn teardown(&self) {
        fs::remove_dir(&self.base_dir).unwrap_or(());
    }
}

pub struct UserHandler {
    base_dir: PathBuf,
}

impl UserHandler {
    fn new<P: AsRef<Path>>(parent_path: P) -> Self {
        let base_dir = parent_path.as_ref().join("users");
        fs::create_dir(&base_dir).unwrap_or(());

        UserHandler { base_dir }
    }

    #[allow(dead_code)]
    fn teardown(&self) {
        fs::remove_dir(&self.base_dir).unwrap_or(());
    }
}

pub struct AttributeHandler {
    base_dir: PathBuf,
    cache: HashMap<Id, Attribute>,
}

impl AttributeHandler {
    fn new<P: AsRef<Path>>(parent_path: P) -> Self {
        let base_dir = parent_path.as_ref().join("attributes");
        fs::create_dir(&base_dir).unwrap_or(());

        AttributeHandler {
            base_dir,
            cache: HashMap::new(),
        }
    }

    #[allow(dead_code)]
    fn teardown(&self) {
        fs::remove_dir(&self.base_dir).unwrap_or(());
    }
}

mod tests {
    use super::{env, AttributeHandler, Database, UserHandler};

    #[test]
    #[allow(non_snake_case)]
    fn test_AttributeHandler() {
        let current_dir = env::current_dir().expect("Could not enter directory");
        let expected_base_dir = current_dir.join("attributes");

        let attribute_handler = AttributeHandler::new(&current_dir);
        assert_eq!(attribute_handler.base_dir, expected_root);

        attribute_handler.teardown();
    }

    #[test]
    #[allow(non_snake_case)]
    fn test_UserHandler() {
        let current_dir = env::current_dir().expect("Could not enter directory");
        let expected_base_dir = current_dir.join("users");

        let user_handler = UserHandler::new(&current_dir);
        assert_eq!(user_handler.base_dir, expected_root);

        user_handler.teardown();
    }

    #[test]
    #[allow(non_snake_case)]
    fn test_Database() {
        let current_dir = env::current_dir().expect("Could not enter directory");
        let expected_base_dir = current_dir.join("database");

        let db = Database::new();
        assert_eq!(db.base_dir, expected_root);

        db.teardown();
    }
}