gen-file-database 1.0.6

File based minimal database
Documentation
use std::io;
use std::path::PathBuf;

use convert_case::Case;
use convert_case::Casing;
use gen_file::file;
use serde::Deserialize;
use serde::Serialize;
use crate::persistence::TargetFolder;
use crate::persistence::Capsule;

pub const FOLDER_NAME: &str = "temp";

pub fn file_name<T>(capsule: &Capsule<T>) -> String {
    format!("{}_{}", capsule.key.to_case(Case::Snake), capsule.id)
}

pub fn create<T: Serialize>(target_folder: &TargetFolder, id: &str, data: T) -> io::Result<()> {
    let path: PathBuf = target_folder.path.join(format!("{}/{}.json", FOLDER_NAME, id));
    let _ = file::delete(&path);

    let json_str = serde_json::to_string(&data)?;
    file::create(json_str, &path)
}

pub fn select<T: for<'a> Deserialize<'a>>(target_folder: &TargetFolder, id: &str) -> Option<T> {
    let path: PathBuf = target_folder.path.join(format!("{}/{}.json", FOLDER_NAME, id));
    file::read(&path).ok()
        .and_then(|result| serde_json::from_str::<T>(&result).ok())
}

pub fn save<T: Serialize + Clone>(capsule: Capsule<T>) -> io::Result<Capsule<T>> {
    create(&capsule.folder, &file_name::<T>(&capsule), &capsule)?; 
    Ok(capsule)
}

#[cfg(test)]
#[path = "../tests/unit_tests/temporary.rs"]
pub mod test;