use bytes::Bytes;
use serde::ser::Serialize;
use thiserror::Error;
use crate::transform::BinaryTransform;
#[derive(Error, Debug)]
pub enum EncodeError {
#[error("Failed to serialize message to data format")]
SerializationFailed(#[from] Box<dyn std::error::Error + Send + Sync>),
#[error("Failed to apply transform to serialized data")]
TransformFailed(#[from] std::io::Error),
}
pub trait Encoder {
fn encode<T>(&self, value: &T) -> Result<Bytes, EncodeError>
where
T: Serialize;
fn encode_mut<T>(&mut self, value: &T) -> Result<Bytes, EncodeError>
where
T: Serialize,
{
self.encode(value)
}
fn transform<BT>(self, transformer: BT) -> TransformedEncoder<Self, BT>
where
Self: Sized,
BT: BinaryTransform,
{
TransformedEncoder::new(self, transformer)
}
}
pub struct TransformedEncoder<E: Encoder, BT: BinaryTransform> {
encoder: E,
transformer: BT,
}
impl<E: Encoder, BT: BinaryTransform> TransformedEncoder<E, BT> {
fn new(encoder: E, transformer: BT) -> Self {
Self {
encoder,
transformer,
}
}
}
impl<E: Encoder, BT: BinaryTransform> Encoder for TransformedEncoder<E, BT> {
fn encode<T>(&self, value: &T) -> Result<Bytes, EncodeError>
where
T: Serialize,
{
self.transformer
.transform(self.encoder.encode(value)?)
.map_err(EncodeError::TransformFailed)
}
fn encode_mut<T>(&mut self, value: &T) -> Result<Bytes, EncodeError>
where
T: Serialize,
{
self.transformer
.transform_mut(self.encoder.encode_mut(value)?)
.map_err(EncodeError::TransformFailed)
}
}