47 lines
1.2 KiB
Rust
47 lines
1.2 KiB
Rust
use std::{fs, path::PathBuf};
|
|
|
|
use anyhow::{bail, Result};
|
|
use directories::ProjectDirs;
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Clone)]
|
|
pub struct Persistence {
|
|
dirs: Option<Dirs>,
|
|
}
|
|
|
|
impl Persistence {
|
|
pub fn new() -> Self {
|
|
Self { dirs: init_dirs() }
|
|
}
|
|
|
|
pub fn save_config<T: Serialize>(&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<T: for<'a> Deserialize<'a>>(&self, file: &str) -> Result<T> {
|
|
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<Dirs> {
|
|
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 })
|
|
}
|