data_rw/serde/
serialize_impl.rs1use crate::serde::error::DataError;
2use crate::Data;
3use serde::ser;
4use serde::Serialize;
5use std::io::Write;
6
7pub struct DataSerializeSeq<'a> {
8 write_mode: u8,
9 write_data: Option<Data>,
10 data: &'a mut Data,
11}
12
13impl<'a> DataSerializeSeq<'a> {
14 #[inline]
15 pub fn new(data: &'a mut Data, len: Option<usize>) -> DataSerializeSeq<'a> {
16 if let Some(len) = len {
17 data.write_fixed(len as u32);
18 DataSerializeSeq {
19 write_mode: 0u8,
20 write_data: None,
21 data,
22 }
23 } else {
24 DataSerializeSeq {
25 write_mode: 1u8,
26 write_data: Some(Data::new()),
27 data,
28 }
29 }
30 }
31}
32
33impl<'a> ser::SerializeSeq for DataSerializeSeq<'a> {
34 type Ok = ();
35 type Error = DataError;
36 #[inline]
37 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
38 where
39 T: Serialize,
40 {
41 if self.write_mode == 0 {
42 value.serialize(&mut *self.data)
43 } else {
44 if let Some(ref mut table) = self.write_data {
45 value.serialize(table)?;
46 }
47 Ok(())
48 }
49 }
50
51 fn end(self) -> Result<Self::Ok, Self::Error> {
52 if self.write_mode == 0 {
53 Ok(())
54 } else {
55 if let Some(ref table) = self.write_data {
56 self.data.write_fixed(table.len() as u32);
57 self.data.write_all(table)?;
58 }
59 Ok(())
60 }
61 }
62}
63
64pub struct DataSerializeTuple<'a> {
65 data: &'a mut Data,
66}
67
68impl<'a> DataSerializeTuple<'a> {
69 #[inline]
70 pub fn new(data: &'a mut Data, len: usize) -> DataSerializeTuple<'_> {
71 data.write_fixed(len as u32);
72 DataSerializeTuple { data }
73 }
74}
75
76impl<'a> ser::SerializeTuple for DataSerializeTuple<'a> {
77 type Ok = ();
78 type Error = DataError;
79 #[inline]
80 fn serialize_element<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
81 where
82 T: Serialize,
83 {
84 value.serialize(&mut *self.data)
85 }
86 #[inline]
87 fn end(self) -> Result<Self::Ok, Self::Error> {
88 Ok(())
89 }
90}
91
92pub struct DataSerializeTupleStruct<'a> {
93 data: &'a mut Data,
94}
95
96impl<'a> DataSerializeTupleStruct<'a> {
97 #[inline]
98 pub fn new(data: &'a mut Data, len: usize) -> DataSerializeTupleStruct<'a> {
99 data.write_fixed(len as u32);
100 DataSerializeTupleStruct { data }
101 }
102}
103
104impl<'a> ser::SerializeTupleStruct for DataSerializeTupleStruct<'a> {
105 type Ok = ();
106 type Error = DataError;
107 #[inline]
108 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
109 where
110 T: Serialize,
111 {
112 value.serialize(&mut *self.data)
113 }
114 #[inline]
115 fn end(self) -> Result<Self::Ok, Self::Error> {
116 Ok(())
117 }
118}
119
120impl<'a> ser::SerializeStruct for DataSerializeTupleStruct<'a> {
121 type Ok = ();
122 type Error = DataError;
123 #[inline]
124 fn serialize_field<T: ?Sized>(
125 &mut self,
126 key: &'static str,
127 value: &T,
128 ) -> Result<(), Self::Error>
129 where
130 T: Serialize,
131 {
132 self.data.write_fixed(key);
133 value.serialize(&mut *self.data)
134 }
135 #[inline]
136 fn end(self) -> Result<Self::Ok, Self::Error> {
137 Ok(())
138 }
139}
140
141pub struct DataSerializeTupleVariant<'a> {
142 data: &'a mut Data,
143}
144
145impl<'a> DataSerializeTupleVariant<'a> {
146 #[inline]
147 pub fn new(
148 data: &'a mut Data,
149 variant: &'static str,
150 len: usize,
151 ) -> DataSerializeTupleVariant<'a> {
152 data.write_fixed(variant);
153 data.write_fixed(len as u32);
154 DataSerializeTupleVariant { data }
155 }
156}
157
158impl<'a> ser::SerializeTupleVariant for DataSerializeTupleVariant<'a> {
159 type Ok = ();
160 type Error = DataError;
161 #[inline]
162 fn serialize_field<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
163 where
164 T: Serialize,
165 {
166 value.serialize(&mut *self.data)
167 }
168 #[inline]
169 fn end(self) -> Result<Self::Ok, Self::Error> {
170 Ok(())
171 }
172}
173
174impl<'a> ser::SerializeStructVariant for DataSerializeTupleVariant<'a> {
175 type Ok = ();
176 type Error = DataError;
177 #[inline]
178 fn serialize_field<T: ?Sized>(
179 &mut self,
180 key: &'static str,
181 value: &T,
182 ) -> Result<(), Self::Error>
183 where
184 T: Serialize,
185 {
186 self.data.write_fixed(key);
187 value.serialize(&mut *self.data)
188 }
189 #[inline]
190 fn end(self) -> Result<Self::Ok, Self::Error> {
191 Ok(())
192 }
193}
194
195pub struct DataSerializeMap<'a> {
196 write_mode: u8,
197 write_key: Option<Vec<Data>>,
198 write_value: Option<Vec<Data>>,
199 data: &'a mut Data,
200}
201
202impl<'a> DataSerializeMap<'a> {
203 #[inline]
204 pub fn new(data: &'a mut Data, len: Option<usize>) -> DataSerializeMap<'a> {
205 if let Some(len) = len {
206 data.write_fixed(len as u32);
207 DataSerializeMap {
208 write_mode: 0u8,
209 write_key: None,
210 write_value: None,
211 data,
212 }
213 } else {
214 DataSerializeMap {
215 write_mode: 1u8,
216 write_key: Some(Vec::new()),
217 write_value: Some(Vec::new()),
218 data,
219 }
220 }
221 }
222}
223
224impl<'a> ser::SerializeMap for DataSerializeMap<'a> {
225 type Ok = ();
226 type Error = DataError;
227 #[inline]
228 fn serialize_key<T: ?Sized>(&mut self, key: &T) -> Result<(), Self::Error>
229 where
230 T: Serialize,
231 {
232 if self.write_mode == 0 {
233 key.serialize(&mut *self.data)
234 } else {
235 if let Some(ref mut table) = self.write_key {
236 let mut data = Data::new();
237 key.serialize(&mut data)?;
238 table.push(data);
239 }
240 Ok(())
241 }
242 }
243 #[inline]
244 fn serialize_value<T: ?Sized>(&mut self, value: &T) -> Result<(), Self::Error>
245 where
246 T: Serialize,
247 {
248 if self.write_mode == 0 {
249 value.serialize(&mut *self.data)
250 } else {
251 if let Some(ref mut table) = self.write_value {
252 let mut data = Data::new();
253 value.serialize(&mut data)?;
254 table.push(data);
255 }
256 Ok(())
257 }
258 }
259 #[inline]
260 fn end(mut self) -> Result<Self::Ok, Self::Error> {
261 if self.write_mode == 0 {
262 Ok(())
263 } else {
264 if let Some(ref mut keys) = self.write_key {
265 if let Some(ref mut values) = self.write_value {
266 assert_eq!(keys.len(), values.len());
267 self.data.write_fixed(keys.len() as u32);
268 for i in 0..keys.len() {
269 let key = keys.get(i).unwrap();
270 let value = values.get(i).unwrap();
271 self.data.write_all(key)?;
272 self.data.write_all(value)?;
273 }
274 }
275 }
276 Ok(())
277 }
278 }
279}