use serde::{de::DeserializeOwned, ser::Serialize};
pub trait Serializer<D> {
type Error;
fn serialize(&self, val: &D) -> Result<Vec<u8>, Self::Error>;
fn deserialize(&self, data: &[u8]) -> Result<D, Self::Error>;
}
pub struct Json;
impl<D> Serializer<D> for Json
where
D: Serialize + DeserializeOwned,
{
type Error = serde_json::Error;
fn serialize(&self, val: &D) -> Result<Vec<u8>, Self::Error> {
serde_json::to_vec(val)
}
fn deserialize(&self, data: &[u8]) -> Result<D, Self::Error> {
serde_json::from_slice(data)
}
}
#[cfg(feature = "cbor-serializer")]
pub struct Cbor;
#[cfg(feature = "cbor-serializer")]
impl<D> Serializer<D> for Cbor
where
D: Serialize + DeserializeOwned,
{
type Error = serde_cbor::Error;
fn serialize(&self, val: &D) -> Result<Vec<u8>, Self::Error> {
serde_cbor::to_vec(val)
}
fn deserialize(&self, data: &[u8]) -> Result<D, Self::Error> {
serde_cbor::from_slice(data)
}
}
#[cfg(feature = "bincode-serializer")]
pub struct Bincode;
#[cfg(feature = "bincode-serializer")]
impl<D> Serializer<D> for Bincode
where
D: Serialize + DeserializeOwned,
{
type Error = Box<dyn std::error::Error + Send + Sync>;
fn serialize(&self, val: &D) -> Result<Vec<u8>, Self::Error> {
bincode::serde::encode_to_vec(val, bincode::config::standard())
.map_err(|err| Box::new(err) as Self::Error)
}
fn deserialize(&self, data: &[u8]) -> Result<D, Self::Error> {
bincode::serde::decode_from_slice(data, bincode::config::standard())
.map(|(value, _)| value)
.map_err(|err| Box::new(err) as Self::Error)
}
}