async_codec_lite/codec/
json.rs1use 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}