Save input mappings to disk
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
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 })
|
||||
}
|
||||
Reference in New Issue
Block a user