use std::{fs, path::PathBuf}; use anyhow::{bail, Result}; use directories::ProjectDirs; use serde::{Deserialize, Serialize}; #[derive(Clone)] pub struct Persistence { dirs: Option, } impl Persistence { pub fn new() -> Self { Self { dirs: init_dirs() } } pub fn save_config(&self, file: &str, data: &T) -> Result<()> { if let Some(dirs) = self.dirs.as_ref() { let bytes = serde_json::to_vec_pretty(data)?; let filename = dirs.config_dir.join(file).with_extension("json"); fs::write(&filename, bytes)?; } Ok(()) } pub fn load_config Deserialize<'a>>(&self, file: &str) -> Result { let Some(dirs) = self.dirs.as_ref() else { bail!("config directory not found"); }; let filename = dirs.config_dir.join(file).with_extension("json"); let bytes = fs::read(filename)?; Ok(serde_json::from_slice(&bytes)?) } } #[derive(Clone)] struct Dirs { config_dir: PathBuf, } fn init_dirs() -> Option { let dirs = ProjectDirs::from("com", "virtual-boy", "Lemur")?; let config_dir = dirs.config_dir().to_path_buf(); fs::create_dir_all(&config_dir).ok()?; Some(Dirs { config_dir }) }