titan_api_codec/dec/
common.rs1use bytes::Bytes;
9use serde::de::DeserializeOwned;
10use thiserror::Error;
11
12use crate::transform::BinaryTransform;
13
14#[derive(Error, Debug)]
16pub enum DecodeError {
17 #[error("Failed to deserialize message from binary data")]
19 DeserializationFailed(#[from] Box<dyn std::error::Error + Send + Sync>),
20 #[error("Failed to apply transform to serialized data")]
22 TransformFailed(#[from] std::io::Error),
23}
24
25pub trait Decoder {
27 fn decode<T>(&self, data: Bytes) -> Result<T, DecodeError>
29 where
30 T: DeserializeOwned;
31
32 fn decode_mut<T>(&mut self, data: Bytes) -> Result<T, DecodeError>
34 where
35 T: DeserializeOwned,
36 {
37 self.decode(data)
38 }
39
40 fn transformed<BT>(self, transformer: BT) -> TransformedDecoder<Self, BT>
43 where
44 Self: Sized,
45 BT: BinaryTransform,
46 {
47 TransformedDecoder::new(self, transformer)
48 }
49}
50
51pub struct TransformedDecoder<D: Decoder, BT: BinaryTransform> {
53 decoder: D,
54 transformer: BT,
55}
56
57impl<D: Decoder, BT: BinaryTransform> TransformedDecoder<D, BT> {
58 fn new(decoder: D, transformer: BT) -> Self {
60 Self {
61 decoder,
62 transformer,
63 }
64 }
65}
66
67impl<D: Decoder, BT: BinaryTransform> Decoder for TransformedDecoder<D, BT> {
68 fn decode<T>(&self, data: Bytes) -> Result<T, DecodeError>
69 where
70 T: DeserializeOwned,
71 {
72 self.decoder.decode(
73 self.transformer
74 .transform(data)
75 .map_err(DecodeError::TransformFailed)?,
76 )
77 }
78
79 fn decode_mut<T>(&mut self, data: Bytes) -> Result<T, DecodeError>
80 where
81 T: DeserializeOwned,
82 {
83 self.decoder.decode_mut(
84 self.transformer
85 .transform_mut(data)
86 .map_err(DecodeError::TransformFailed)?,
87 )
88 }
89}