volans_codec/
json.rs

1use std::io;
2
3use asynchronous_codec::{Bytes, BytesMut, Decoder, Encoder};
4use serde::{Serialize, de::DeserializeOwned};
5use unsigned_varint::codec::UviBytes;
6
7pub struct JsonUviCodec<M> {
8    uvi_codec: UviBytes,
9    _marker: std::marker::PhantomData<M>,
10}
11
12impl<M> Default for JsonUviCodec<M> {
13    fn default() -> Self {
14        JsonUviCodec {
15            uvi_codec: UviBytes::default(),
16            _marker: std::marker::PhantomData,
17        }
18    }
19}
20
21impl<M> Clone for JsonUviCodec<M> {
22    fn clone(&self) -> Self {
23        let mut uvi = UviBytes::default();
24        uvi.set_max_len(self.uvi_codec.max_len());
25        JsonUviCodec {
26            uvi_codec: uvi,
27            _marker: std::marker::PhantomData,
28        }
29    }
30}
31
32impl<M> JsonUviCodec<M> {
33    pub fn set_max_len(&mut self, val: usize) {
34        self.uvi_codec.set_max_len(val)
35    }
36
37    pub fn max_len(&self) -> usize {
38        self.uvi_codec.max_len()
39    }
40}
41
42impl<M> Encoder for JsonUviCodec<M>
43where
44    M: Serialize,
45{
46    type Item<'a> = M;
47    type Error = io::Error;
48
49    fn encode(&mut self, item: Self::Item<'_>, dst: &mut BytesMut) -> Result<(), Self::Error> {
50        let buffer = serde_json::to_vec(&item)?;
51        self.uvi_codec.encode(Bytes::from(buffer), dst)
52    }
53}
54
55impl<M> Decoder for JsonUviCodec<M>
56where
57    M: DeserializeOwned,
58{
59    type Item = M;
60    type Error = io::Error;
61
62    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
63        match self.uvi_codec.decode(src) {
64            Ok(Some(bytes)) => {
65                let item = serde_json::from_slice(bytes.as_ref())?;
66                Ok(Some(item))
67            }
68            Ok(None) => Ok(None),
69            Err(e) => Err(io::Error::new(io::ErrorKind::InvalidData, e)),
70        }
71    }
72}