use serde::{Deserialize, Serialize};
use std::{
fs,
io::Result as IoResult
};
use ron::ser::PrettyConfig;
#[derive(Clone, Copy)]
pub enum ConfigType {
Toml,
Ron
}
pub trait Config: Serialize + Default + for <'de> Deserialize<'de> {
const FILE_NAME: &'static str;
const TYPE: ConfigType = ConfigType::Toml;
fn get_save_dir() -> String;
fn get_full_path() -> String { format!("{}/{}", Self::get_save_dir(), Self::FILE_NAME) }
#[track_caller]
fn load() -> Self {
let mut config = Self::default();
let file_str = match fs::read_to_string(Self::get_full_path()) {
Ok(file) => file,
Err(_) => {
config.save().expect("Unable to load config!");
return config;
}
};
match Self::TYPE {
ConfigType::Toml => {
match toml::from_str(&file_str) {
Ok(t) => config = t,
Err(_) => return Self::default(),
}
}
ConfigType::Ron => {
match ron::from_str(&file_str) {
Ok(r) => config = r,
Err(_) => return Self::default()
}
}
}
config
}
#[track_caller]
fn save(&self) -> IoResult<()> {
let save_str = match Self::TYPE {
ConfigType::Toml => toml::to_string_pretty(&self).unwrap(),
ConfigType::Ron => {
let cfg = PrettyConfig::default();
ron::ser::to_string_pretty(&self, cfg).unwrap()
}
};
fs::create_dir_all(Self::get_save_dir())?;
fs::write(Self::get_full_path(), save_str)
}
}