Skip to main content

dnet_codecs/
json.rs

1//! JSON codec using [serde_json].
2
3use serde::{Deserialize, Serialize};
4use std::io::{Read, Write};
5
6use dnet_base::{Decode, Encode};
7
8pub use serde_json::Error;
9
10/// JSON codec.
11#[derive(Debug, Clone, Copy, Default)]
12pub struct JsonCodec {}
13
14impl Encode for JsonCodec {
15    type Error = self::Error;
16
17    fn encode<W, T>(&mut self, writer: W, message: &T) -> Result<(), Self::Error>
18    where
19        W: Write,
20        T: Serialize,
21    {
22        serde_json::to_writer(writer, message)
23    }
24}
25
26impl Decode for JsonCodec {
27    type Error = self::Error;
28
29    fn decode<R, T>(&mut self, reader: R) -> Result<T, Self::Error>
30    where
31        R: Read,
32        for<'de> T: Deserialize<'de>,
33    {
34        serde_json::from_reader(reader)
35    }
36}
37
38#[cfg(test)]
39mod tests {
40    use dnet_base::{Decode, Encode};
41
42    use crate::JsonCodec;
43
44    #[test]
45    fn test_codec() {
46        let message: (i16, String) = (10, "Hello World!".to_string());
47        let mut buffer = vec![];
48        let mut codec = JsonCodec::default();
49        codec.encode(&mut buffer, &message).unwrap();
50        let decoded = codec.decode(&buffer[..]).unwrap();
51        assert_eq!(message, decoded);
52    }
53}