use crate::error;
use std::io::Read;
use serde::de::DeserializeOwned;
use serde::Serialize;
#[cfg(feature = "ron_enc")]
pub use self::ron::Ron;
#[cfg(feature = "yaml_enc")]
pub use self::yaml::Yaml;
#[cfg(feature = "bin_enc")]
pub use self::bincode::Bincode;
pub trait DeSerializer<T: Serialize + DeserializeOwned>:
std::default::Default + Send + Sync + Clone
{
fn serialize(&self, val: &T) -> error::DeSerResult<Vec<u8>>;
fn deserialize<R: Read>(&self, s: R) -> error::DeSerResult<T>;
}
#[cfg(feature = "ron_enc")]
mod ron {
use std::io::Read;
use serde::de::DeserializeOwned;
use serde::Serialize;
use ron::de::from_reader as from_ron_string;
use ron::ser::to_string_pretty as to_ron_string;
use ron::ser::PrettyConfig;
use crate::deser::DeSerializer;
use crate::error;
#[derive(Debug, Default, Clone)]
pub struct Ron;
impl<T: Serialize + DeserializeOwned> DeSerializer<T> for Ron {
fn serialize(&self, val: &T) -> error::DeSerResult<Vec<u8>> {
Ok(to_ron_string(val, PrettyConfig::default()).map(String::into_bytes)?)
}
fn deserialize<R: Read>(&self, s: R) -> error::DeSerResult<T> {
Ok(from_ron_string(s).map_err(|e| e.code)?)
}
}
}
#[cfg(feature = "yaml_enc")]
mod yaml {
use std::io::Read;
use serde::de::DeserializeOwned;
use serde::Serialize;
use serde_yaml::{from_reader as from_yaml_string, to_string as to_yaml_string};
use crate::deser::DeSerializer;
use crate::error;
#[derive(Debug, Default, Clone)]
pub struct Yaml;
impl<T: Serialize + DeserializeOwned> DeSerializer<T> for Yaml {
fn serialize(&self, val: &T) -> error::DeSerResult<Vec<u8>> {
Ok(to_yaml_string(val).map(String::into_bytes)?)
}
fn deserialize<R: Read>(&self, s: R) -> error::DeSerResult<T> {
Ok(from_yaml_string(s)?)
}
}
}
#[cfg(feature = "bin_enc")]
mod bincode {
use std::io::Read;
use bincode::{deserialize_from, serialize};
use serde::de::DeserializeOwned;
use serde::Serialize;
use crate::deser::DeSerializer;
use crate::error;
#[derive(Debug, Default, Clone)]
pub struct Bincode;
impl<T: Serialize + DeserializeOwned> DeSerializer<T> for Bincode {
fn serialize(&self, val: &T) -> error::DeSerResult<Vec<u8>> {
Ok(serialize(val)?)
}
fn deserialize<R: Read>(&self, s: R) -> error::DeSerResult<T> {
Ok(deserialize_from(s)?)
}
}
}