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;