use bytes::Bytes;
use serde::de::DeserializeOwned;
use thiserror::Error;
use crate::transform::BinaryTransform;
#[derive(Error, Debug)]
pub enum DecodeError {
#[error("Failed to deserialize message from binary data")]
DeserializationFailed(#[from] Box<dyn std::error::Error + Send + Sync>),
#[error("Failed to apply transform to serialized data")]
TransformFailed(#[from] std::io::Error),
}
pub trait Decoder {
fn decode<T>(&self, data: Bytes) -> Result<T, DecodeError>
where
T: DeserializeOwned;
fn decode_mut<T>(&mut self, data: Bytes) -> Result<T, DecodeError>
where
T: DeserializeOwned,
{
self.decode(data)
}
fn transformed<BT>(self, transformer: BT) -> TransformedDecoder<Self, BT>
where
Self: Sized,
BT: BinaryTransform,
{
TransformedDecoder::new(self, transformer)
}
}
pub struct TransformedDecoder<D: Decoder, BT: BinaryTransform> {
decoder: D,
transformer: BT,
}
impl<D: Decoder, BT: BinaryTransform> TransformedDecoder<D, BT> {
fn new(decoder: D, transformer: BT) -> Self {
Self {
decoder,
transformer,
}
}
}
impl<D: Decoder, BT: BinaryTransform> Decoder for TransformedDecoder<D, BT> {
fn decode<T>(&self, data: Bytes) -> Result<T, DecodeError>
where
T: DeserializeOwned,
{
self.decoder.decode(
self.transformer
.transform(data)
.map_err(DecodeError::TransformFailed)?,
)
}
fn decode_mut<T>(&mut self, data: Bytes) -> Result<T, DecodeError>
where
T: DeserializeOwned,
{
self.decoder.decode_mut(
self.transformer
.transform_mut(data)
.map_err(DecodeError::TransformFailed)?,
)
}
}