1use crate::{Decoder, Encoder};
2use serde_lite::{Deserialize, Intermediate, Serialize};
3
4pub struct SerdeLite<C>(C);
35
36#[derive(Debug, thiserror::Error)]
37pub enum SerdeLiteEncodeError<E> {
38 #[error("Error from serde-lite: {0}")]
39 SerdeLite(serde_lite::Error),
40 #[error("Error from wrapped encoder")]
41 Encoder(#[from] E),
42}
43
44#[derive(Debug, thiserror::Error)]
45pub enum SerdeLiteDecodeError<E> {
46 #[error("Error from serde-lite: {0}")]
47 SerdeLite(serde_lite::Error),
48 #[error("Error from wrapped decoder")]
49 Decoder(#[from] E),
50}
51
52impl<T, E> Encoder<T> for SerdeLite<E>
53where
54 T: Serialize,
55 E: Encoder<Intermediate>,
56{
57 type Error = SerdeLiteEncodeError<<E as Encoder<Intermediate>>::Error>;
58 type Encoded = <E as Encoder<Intermediate>>::Encoded;
59
60 fn encode(val: &T) -> Result<Self::Encoded, Self::Error> {
61 let intermediate = val.serialize().map_err(SerdeLiteEncodeError::SerdeLite)?;
62 Ok(E::encode(&intermediate)?)
63 }
64}
65
66impl<T, D> Decoder<T> for SerdeLite<D>
67where
68 T: Deserialize,
69 D: Decoder<Intermediate>,
70{
71 type Error = SerdeLiteDecodeError<<D as Decoder<Intermediate>>::Error>;
72 type Encoded = <D as Decoder<Intermediate>>::Encoded;
73
74 fn decode(val: &Self::Encoded) -> Result<T, Self::Error> {
75 let intermediate = D::decode(val)?;
76 T::deserialize(&intermediate).map_err(SerdeLiteDecodeError::SerdeLite)
77 }
78}