extern crate ron;
#[allow(unused_imports)]
#[macro_use]
extern crate serde;
extern crate serde_json;
use std::error::Error;
use std::fs::{ File };
use std::io::{Read, Write};
use std::path::PathBuf;
use ron::de::from_str;
use serde::de::DeserializeOwned;
pub trait Fetchable {
fn deserialize_l<T: DeserializeOwned + Default + Fetchable>(
f_path: &PathBuf,
) -> Result<T, Box<dyn Error>>;
fn deserialize_bin<T>(f_path: &PathBuf) -> Result<T, Box<dyn Error>>
where T: DeserializeOwned + Default {
let mut file = File::open(f_path)?;
let mut buffer = Vec::new();
file.read_to_end(&mut buffer)?;
let item: T = match bincode::deserialize(&buffer) {
Ok(item) => item,
Err(_e) => T::default(),
};
buffer.clear();
Ok(item)
}
fn deserialize_json<T>(f_path: &PathBuf) -> Result<T, Box<dyn Error>>
where T: DeserializeOwned + Default {
let mut file = File::open(f_path)?;
let mut buffer = String::new();
file.read_to_string(&mut buffer)?;
let item: T = match serde_json::from_str(&buffer) {
Ok(item) => item,
Err(_e) => T::default(),
};
buffer.clear();
Ok(item)
}
fn deserialize_ron<T>(f_path: &PathBuf) -> Result<T, Box<dyn Error>>
where T: DeserializeOwned + Default {
let mut file = File::open(f_path)?;
let mut buffer = String::new();
file.read_to_string(&mut buffer)?;
let item: T = match from_str(&buffer) {
Ok(item) => item,
Err(_e) => T::default(),
};
buffer.clear();
Ok(item)
}
fn serialize_l(&self) -> Result<Vec<u8>, Box<dyn Error>>
where
Self: serde::Serialize + Fetchable;
fn serialize_bin(&self) -> Result<Vec<u8>, Box<dyn Error>>
where
Self: serde::Serialize,
{
let mut buf = vec![];
buf.clear();
buf = bincode::serialize(self)?;
Ok(buf)
}
fn serialize_ron(&self) -> Result<Vec<u8>, Box<dyn Error>>
where
Self: serde::Serialize,
{
Ok(
ron::ser::to_string_pretty(&self, ron::ser::PrettyConfig::default())
.expect("Failed pretty string.")
.as_bytes()
.to_vec(),
)
}
fn serialize_json(&self) -> Result<Vec<u8>, Box<dyn Error>>
where
Self: serde::Serialize,
{
Ok(
serde_json::ser::to_string_pretty(&self)
.expect("Failed pretty string.")
.as_bytes()
.to_vec(),
)
}
fn save(&self, path: &PathBuf) -> Result<(), Box<dyn Error>>
where
Self: serde::Serialize + Fetchable,
{
let mut f = File::create(&path)?;
let content = self.serialize_l()?;
f.write_all(content.as_slice())?;
match f.sync_all() {
Ok(_) => Ok(()),
Err(e) => Err(Box::new(e)),
}
}
fn fetch_or_default<T>(file_path: &PathBuf) -> Result<(T, bool), Box<dyn Error>>
where T: Default + DeserializeOwned + Fetchable {
let path = file_path.to_path_buf();
let result: (T, bool) = if path.exists() {
match T::deserialize_l(&path) {
Ok(t) => (t, false),
Err(_) => (T::default(), true),
}
} else {
(T::default(), true)
};
Ok(result)
}
}