use std::{fs::{File, OpenOptions}, io::{Read, Write}};
use protobuf::Message;
pub trait Loader<T: Message> {
fn load() -> T;
fn load_from(config_file: &str) -> T {
match dirs::config_dir() {
Some(dir) => {
let path = dir.join(config_file);
match path.exists() {
true => {
let mut buf = Vec::new();
match File::open(path).expect("").read_to_end(&mut buf) {
Ok(_) => match T::parse_from_bytes(&buf) {
Ok(t) => t,
Err(_) => T::default(),
},
Err(_) => T::default(),
}
}
false => T::default(),
}
}
None => T::default(),
}
}
}
pub trait Flush<T: Message> {
fn flush(message: T);
fn flush_to(message: T, config_file: &str) {
match dirs::config_dir() {
Some(dir) => {
let path = dir.join(config_file);
match path.exists() {
true => {
let mut option = OpenOptions::new();
option.write(true).truncate(true);
option
.open(path)
.expect("open fail")
.write_all(message.write_to_bytes().expect("ser fail").as_slice())
.expect("write config fail");
}
false => {
let mut option = OpenOptions::new();
option.create(true).write(true).truncate(true);
option
.open(path)
.expect("open fail")
.write_all(message.write_to_bytes().expect("to byte fail").as_slice())
.expect("write fail");
}
}
}
None => {}
}
}
}