embytes_buffer/
json.rs

1use serde::Deserialize;
2use serde_json_core::{from_slice, to_slice};
3
4use crate::{Buffer, BufferError, BufferReader, BufferWriter};
5
6pub trait JsonWriter {
7    fn serialize_json<T: serde::Serialize>(&mut self, src: &T) -> Result<usize, BufferError>;
8}
9
10impl <'a, W: BufferWriter> JsonWriter for W {
11    fn serialize_json<T: serde::Serialize>(&mut self, src: &T) -> Result<usize, BufferError> {
12        
13        let n = to_slice(src, self)
14            .map_err(|_e| BufferError::NoCapacity)?;
15
16        self.commit(n)?;
17        Ok(n)
18    }
19}
20
21impl <S: AsMut<[u8]> + AsRef<[u8]>> JsonWriter for Buffer<S> {
22    fn serialize_json<T: serde::Serialize>(&mut self, src: &T) -> Result<usize, BufferError> {
23        
24        let tgt = &mut self.source.as_mut()[self.write_position..];
25        
26        let n = to_slice(src, tgt)
27            .map_err(|_e| BufferError::NoCapacity)?;
28
29        self.write_position += n;
30        Ok(n)
31    }
32}
33pub trait JsonReader<'a> {
34    fn deserialize_json<'de, T: Deserialize<'de>>(&'de mut self) -> Result<T, BufferError> where 'a: 'de;
35}
36
37
38impl <'a, R: BufferReader> JsonReader<'a> for R {
39    fn deserialize_json<'de, T: Deserialize<'de>>(&'de mut self) -> Result<T, BufferError> where 'a: 'de {
40        
41        let (res, n) = from_slice::<'de, T>(self)
42            .map_err(|e| BufferError::JsonDeserialize(e))?;
43
44        self.add_bytes_read(n);
45
46        Ok(res)
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use core::str::{self, from_utf8};
53
54    use serde::{Deserialize, Serialize};
55
56    use crate::{Buffer, ReadWrite};
57
58    use super::{JsonReader, JsonWriter};
59
60
61    #[derive(Debug, Serialize, Deserialize, PartialEq)]
62    struct DummyJson {
63        a: usize
64    }
65
66    #[test]
67    fn test_serialize_json() {
68
69        let d = DummyJson{ a: 4 };
70
71        let mut b = [0u8; 64];
72        let mut buf = Buffer::new(&mut b);
73
74        buf.serialize_json(&d).unwrap();
75
76        const EXPECTED_JSON: &'static str = "{\"a\":4}";
77
78        let json = from_utf8(buf.data()).unwrap();
79
80        assert_eq!(json, EXPECTED_JSON);
81    }
82
83    #[test]
84    fn test_deserialize_json() {
85
86        const JSON: &'static str = "{\"a\":7}";
87
88        let mut b = [0u8; 64];
89        let mut buf = Buffer::new(&mut b);
90
91        buf.write_base(JSON.as_bytes()).unwrap();
92
93        let mut reader = buf.create_reader();
94
95        let res = reader.deserialize_json::<'_, DummyJson>().unwrap();
96
97        assert_eq!(res.a, 7);
98        drop(reader);
99
100        assert_eq!(buf.read_position, JSON.len());
101    }
102
103    // Not supported by lib
104    /*
105    #[test]
106    fn test_multi_deserialize_json() {
107
108        const JSON_1: &'static str = "{\"a\":9}";
109        const JSON_2: &'static str = "{\"a\":234}";
110
111        let mut b = [0u8; 64];
112        let mut buf = Buffer::new(&mut b);
113
114        buf.write_base(JSON_1.as_bytes()).unwrap();
115        buf.write_base(JSON_2.as_bytes()).unwrap();
116
117        let mut reader = buf.create_reader();
118
119        let res = reader.deserialize_json::<'_, DummyJson>().unwrap();
120
121        assert_eq!(res.a, 9);
122        drop(reader);
123
124        assert_eq!(buf.read_position, JSON_1.len());
125    }
126    */
127
128}