async_codec_lite/codec/
cbor.rs

1use super::{Decoder, Encoder};
2use bytes::{Buf, BufMut, BytesMut};
3use serde::{Deserialize, Serialize};
4use std::marker::PhantomData;
5
6pub struct CborCodec<Enc, Dec>(PhantomData<(Enc, Dec)>);
7impl_phantom!(CborCodec<Enc, Dec>);
8
9impl<Enc, Dec> Decoder for CborCodec<Enc, Dec>
10where
11    for<'de> Dec: Deserialize<'de> + 'static,
12{
13    type Error = serde_cbor::Error;
14    type Item = Dec;
15
16    fn decode(&mut self, buf: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
17        let mut de = serde_cbor::Deserializer::from_slice(buf);
18
19        let res: Result<Dec, _> = serde::de::Deserialize::deserialize(&mut de);
20
21        let res = match res {
22            Ok(v) => Ok(Some(v)),
23            Err(e) if e.is_eof() => Ok(None),
24            Err(e) => Err(e),
25        };
26
27        let offset = de.byte_offset();
28
29        buf.advance(offset);
30
31        res
32    }
33}
34
35impl<Enc, Dec> Encoder for CborCodec<Enc, Dec>
36where
37    Enc: Serialize + 'static,
38{
39    type Error = serde_cbor::Error;
40    type Item = Enc;
41
42    fn encode(&mut self, data: Self::Item, buf: &mut BytesMut) -> Result<(), Self::Error> {
43        let j = serde_cbor::to_vec(&data)?;
44
45        buf.reserve(j.len());
46        buf.put_slice(&j);
47
48        Ok(())
49    }
50}
51
52#[cfg(test)]
53mod test {
54    use bytes::BytesMut;
55    use serde::{Deserialize, Serialize};
56
57    use super::{CborCodec, Decoder, Encoder};
58
59    #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
60    struct TestStruct {
61        pub name: String,
62        pub data: u16,
63    }
64
65    #[test]
66    fn cbor_codec_encode_decode() {
67        let mut codec = CborCodec::<TestStruct, TestStruct>::new();
68        let mut buff = BytesMut::new();
69
70        let item1 = TestStruct {
71            name: "Test name".to_owned(),
72            data: 16,
73        };
74        codec.encode(item1.clone(), &mut buff).unwrap();
75
76        let item2 = codec.decode(&mut buff).unwrap().unwrap();
77        assert_eq!(item1, item2);
78
79        assert_eq!(codec.decode(&mut buff).unwrap(), None);
80
81        assert_eq!(buff.len(), 0);
82    }
83
84    #[test]
85    fn cbor_codec_partial_decode() {
86        let mut codec = CborCodec::<TestStruct, TestStruct>::new();
87        let mut buff = BytesMut::new();
88
89        let item1 = TestStruct {
90            name: "Test name".to_owned(),
91            data: 34,
92        };
93        codec.encode(item1, &mut buff).unwrap();
94
95        let mut start = buff.clone().split_to(4);
96        assert_eq!(codec.decode(&mut start).unwrap(), None);
97
98        codec.decode(&mut buff).unwrap().unwrap();
99
100        assert_eq!(buff.len(), 0);
101    }
102}