#[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 {
let mut base_dir = match env::current_dir() {
Ok(dir) => dir,
Err(err) => panic!(err),
};
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(¤t_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(¤t_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();
}
}