#![allow(dead_code)]
use super::error::StreamError;
pub trait Serializer<T> {
fn serialize(&self, value: &T) -> Result<Vec<u8>, StreamError>;
}
pub trait Deserializer<T> {
fn deserialize(&self, data: &[u8]) -> Result<T, StreamError>;
}
pub trait Serde<T>: Serializer<T> + Deserializer<T> {}
impl<T, S> Serde<T> for S where S: Serializer<T> + Deserializer<T> {}
#[derive(Debug, Clone, Copy, Default)]
pub struct JsonSerde;
impl<T: serde::Serialize> Serializer<T> for JsonSerde {
fn serialize(&self, value: &T) -> Result<Vec<u8>, StreamError> {
serde_json::to_vec(value).map_err(|e| StreamError::Serde(e.to_string()))
}
}
impl<T: serde::de::DeserializeOwned> Deserializer<T> for JsonSerde {
fn deserialize(&self, data: &[u8]) -> Result<T, StreamError> {
serde_json::from_slice(data).map_err(|e| StreamError::Serde(e.to_string()))
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct BytesSerde;
impl Serializer<Vec<u8>> for BytesSerde {
fn serialize(&self, value: &Vec<u8>) -> Result<Vec<u8>, StreamError> {
Ok(value.clone())
}
}
impl Deserializer<Vec<u8>> for BytesSerde {
fn deserialize(&self, data: &[u8]) -> Result<Vec<u8>, StreamError> {
Ok(data.to_vec())
}
}
#[derive(Debug, Clone, Copy, Default)]
pub struct StringSerde;
impl Serializer<String> for StringSerde {
fn serialize(&self, value: &String) -> Result<Vec<u8>, StreamError> {
Ok(value.as_bytes().to_vec())
}
}
impl Deserializer<String> for StringSerde {
fn deserialize(&self, data: &[u8]) -> Result<String, StreamError> {
String::from_utf8(data.to_vec()).map_err(|e| StreamError::Serde(e.to_string()))
}
}