Documentation
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 => {}
        }
    }
}