use serde::Serialize;
use serde::de::DeserializeOwned;
use std::fs::{self, File};
use std::io::{Read, Write};
use std::path::{Path, PathBuf};
fn save_data(data: &[u8], file_path: &Path) -> Result<(), Box<dyn std::error::Error>> {
if let Some(parent) = file_path.parent()
&& !parent.exists()
{
fs::create_dir_all(parent)?;
}
let mut file = File::create(file_path)?;
file.write_all(data)?;
Ok(())
}
pub fn load_json_data<T, P>(data: T, file_path: P) -> Result<T, Box<dyn std::error::Error>>
where
T: Serialize + DeserializeOwned,
P: AsRef<Path>,
{
if !file_path.as_ref().exists() {
let serialized_data = serde_json::to_string(&data)?;
save_data(serialized_data.as_bytes(), file_path.as_ref())?;
return Ok(data);
}
let mut file = File::open(&file_path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
let deserialized_data = serde_json::from_str(&contents)?;
Ok(deserialized_data)
}
pub fn load_toml_data<T, P>(data: T, file_path: P) -> Result<T, Box<dyn std::error::Error>>
where
T: Serialize + DeserializeOwned,
P: AsRef<Path>,
{
if !file_path.as_ref().exists() {
let serialized_data = toml::to_string(&data)?;
save_data(serialized_data.as_bytes(), file_path.as_ref())?;
return Ok(data);
}
let mut file = File::open(file_path)?;
let mut contents = String::new();
file.read_to_string(&mut contents)?;
let deserialized_data = toml::from_str(&contents)?;
Ok(deserialized_data)
}
pub fn save_json_data<T, P>(data: &T, file_path: P) -> Result<(), Box<dyn std::error::Error>>
where
T: Serialize,
P: AsRef<Path>,
{
let serialized_data = serde_json::to_string(data)?;
save_data(serialized_data.as_bytes(), file_path.as_ref())?;
Ok(())
}
pub fn save_toml_data<T, P>(data: &T, file_path: P) -> Result<(), Box<dyn std::error::Error>>
where
T: Serialize,
P: AsRef<Path>,
{
let serialized_data = toml::to_string(data)?;
save_data(serialized_data.as_bytes(), file_path.as_ref())?;
Ok(())
}
pub fn get_data_root_path() -> PathBuf {
let mut current_dir = std::env::current_dir().expect("Get current directory failed");
current_dir.push("data");
current_dir
}