mintdb 0.1.0-beta.3

MintDB is an open source document based database built in Rust.
Documentation
use serde_cbor::from_reader;
use serde_json::json;
use crate::kvs::{store::Datastore, table::TableMetadata};
use crate::kvs::document::Document;
use crate::prelude::*;

use super::write::{open_directory, open_document_file};

pub async fn read_from_fs(db: &Datastore) -> Result<()> {
    check_ds_dir().await?;
    let tbls = std::fs::read_dir("mint.db/ds")
    .unwrap()
    .map(|res| res.unwrap())
    .filter(|dir| dir.file_type().unwrap().is_dir())
    .map(|dir| dir.file_name().into_string().unwrap())
    .collect::<Vec<String>>();
    for tb in tbls {
        read_table(db, &tb).await?;
    }
    Ok(())
}

pub async fn read_table(db: &Datastore, tb: &str) -> Result<()> {
    let path = f!("mint.db/ds/{}", tb);
    open_dir(&path).await?;
    for entry in std::fs::read_dir(path)? {
        let entry = entry?;
        let pb = entry.path();
        let mut file = match std::fs::File::open(&pb) {
            Ok(f) => f,
            Err(_) => {
                std::fs::File::create(pb.clone())?
            }
        };

        let doc_id = pb.file_stem()
        .ok_or(Error::Request)?
        .to_str()
        .ok_or(Error::Request)?;

        let document: Document = from_reader(&mut file).unwrap_or_default();

        db.merge_auth(tb, doc_id, json!(document.data)).await?;
    }
    Ok(())
}

pub async fn read_document(tb:&str, doc: &str) -> Result<Document> {
    open_directory(tb).await?;
    let mut file = open_document_file(tb, doc).await?;
    let document: Document = from_reader(&mut file).unwrap_or_default();
    Ok(document)
}
pub async fn read_tb_metadata(tb: &str) -> Result<TableMetadata> {
    open_directory(tb).await?;
    let mut file = open_document_file(tb, "meta").await?;
    let tb_metadata: TableMetadata = from_reader(&mut file).unwrap_or_default();
    Ok(tb_metadata)

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

                }
                Err(_) => {
                    std::fs::create_dir_all("mint.db/ds")?;
                }
            }
        }
        Err(_) => {
            std::fs::create_dir_all("mint.db/ds")?;
        }
    };
    Ok(())
}