use serde::de::DeserializeOwned;
use serde::ser::Serialize;
use bincode;
use serde_yaml;
pub trait SerDesType {
type Error;
fn serial<T: ?Sized + Serialize>(obj: &T) -> Result<Vec<u8>, Self::Error>;
fn deserial<T: DeserializeOwned>(v: &'_ [u8]) -> Result<T, Self::Error>;
}
pub struct JSON;
impl SerDesType for JSON {
type Error = serde_json::Error;
fn serial<T: ?Sized + Serialize>(obj: &T) -> Result<Vec<u8>, Self::Error> {
return serde_json::to_vec(obj);
}
fn deserial<T: DeserializeOwned>(v: &'_ [u8])-> Result<T, Self::Error> {
return serde_json::from_slice(v);
}
}
pub struct Bincode;
impl SerDesType for Bincode {
type Error = bincode::Error;
fn serial<T: ?Sized + Serialize>(obj: &T) -> Result<Vec<u8>, Self::Error> {
return bincode::serialize(obj);
}
fn deserial<T: DeserializeOwned>(v: &'_ [u8])-> Result<T, Self::Error> {
return bincode::deserialize(v);
}
}
pub struct YAML;
impl SerDesType for YAML {
type Error = serde_yaml::Error;
fn serial<T: ?Sized + Serialize>(obj: &T) -> Result<Vec<u8>, Self::Error> {
return serde_yaml::to_vec(obj);
}
fn deserial<T: DeserializeOwned>(v: &'_ [u8])-> Result<T, Self::Error> {
return serde_yaml::from_slice(v);
}
}