mintdb 0.1.0-beta.3

MintDB is an open source document based database built in Rust.
Documentation
use std::collections::BTreeMap;
use std::fs::metadata;
use serde_cbor::to_writer;
use serde_json::json;
use serde_json::Value;
use crate::kvs::document::Document;
use crate::kvs::table::TableMetadata;
use crate::prelude::*;

pub async fn commit_document(tb: &str, doc: &str, data: Value) -> Result<()> {
    let data= data.as_object()
    .ok_or(Error::Request)?
    .iter().map(|(k, v)| (k.to_owned(), v.to_owned()))
    .collect::<BTreeMap<String, Value>>();
    let mut file = open_document_file(tb, doc).await?;
    let mut document = Document::new(doc);
    document.data = data.to_owned();
    match to_writer(&mut file, &json!(document)) {
        Ok(_) => Ok(()),
        Err(e) => Err(Error::BinError(e))
    }
}


pub async fn delete_document(tb: &str, doc: &str) -> Result<()> {
    let path = f!("mint.db/ds/{tb}/{doc}.bin");
    match metadata(&path) {
        Ok(_) => {
            std::fs::remove_file(path)?;
            Ok(())
        }
        Err(e) => {
            Err(Error::IOError(e))
        }
    }
}
pub async fn commit_table(tb: TableMetadata) -> Result<()> {
    let path = f!("mint.db/ds/{}/meta.bin", &tb.id);
    open_directory(&tb.id).await?;
    let mut file = std::fs::OpenOptions::new()
    .create(true)
    .write(true)
    .open(&path)?;
    match to_writer(&mut file, &json!(tb)) {
        Ok(_) => Ok(()),
        Err(e) => Err(Error::BinError(e))
    }
}


pub async fn delete_table(tb: &str) -> Result<()> {
    let path = f!("mint.db/ds/{tb}");
    match metadata(&path) {
        Ok(_) => {
            std::fs::remove_dir_all(path)?;
            Ok(())
        }
        Err(e) => Err(Error::IOError(e))
    }
}

pub async fn open_directory(tb: &str) -> Result<()> {
    let path = f!("mint.db/ds/{tb}");
    match std::fs::metadata("mint.db") {
        Ok(_) => {
            match metadata("mint.db/ds/") {
                Ok(_) => {
                    match metadata(&path) {
                        Ok(_) => {
                            Ok(())
                        }
                        Err(_) => {
                            std::fs::create_dir_all(path)?;
                            Ok(())
                        }
                    }
                }
                Err(_) => {
                    std::fs::create_dir_all(&path)?;
                    Ok(())
                }
            }
        }
        Err(_) => {
            let path = f!("mint.db/ds/{tb}");
            std::fs::create_dir_all(path)?;
            Ok(())
        }
    }
}

pub async fn open_document_file(tb: &str, doc: &str) -> Result<std::fs::File> {
    open_directory(tb).await?;
    let path = format!("mint.db/ds/{}/{}.bin", tb, doc);
    let file = std::fs::OpenOptions::new()
        .create(true)
        .write(true)
        .open(path)?;
    Ok(file)
}