async_codec_lite/codec/
json.rs

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