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 }