serde_binary_adv/serde_binary_adv/stream/
ser.rs1use std::io::Write;
4
5use super::super::Result;
6use crate::{
7 BinaryError,
8 serde_binary_adv::common::{
9 compress_usize,
10 flags::{self, NONUNIT_VARIANT, STRUCT_VARIANT, UNIT_VARIANT},
11 },
12};
13use num::traits::ToBytes;
14use serde::{Serialize, ser};
15
16pub struct Serializer<'se> {
18 output: &'se mut dyn Write,
19 big_endian: bool,
20 unsized_seq: bool,
21}
22
23impl<'se> Serializer<'se> {
24 pub fn write_bytes<T>(output: &'se mut impl Write, value: &T, big_endian: bool) -> Result<()>
26 where
27 T: Serialize,
28 {
29 let mut serializer = Self::new(output, big_endian);
30 value.serialize(&mut serializer)?;
31 Ok(())
32 }
33
34 pub fn new(output: &'se mut impl Write, big_endian: bool) -> Self {
36 Self {
37 output,
38 big_endian,
39 unsized_seq: false,
40 }
41 }
42
43 fn write(&mut self, data: &Vec<u8>) {
44 self.output.write(data.as_slice()).unwrap();
45 }
46
47 fn serialize_num<T: ToBytes>(self: &mut Self, v: T) -> Result<()> {
48 if self.big_endian {
49 self.write(&v.to_be_bytes().as_mut().to_vec());
50 } else {
51 self.write(&v.to_le_bytes().as_mut().to_vec());
52 }
53 Ok(())
54 }
55
56 fn serialize_vec<T: ToBytes>(self: &mut Self, v: Vec<T>) -> Result<()> {
57 for item in v {
58 self.serialize_num(item)?;
59 }
60 Ok(())
61 }
62
63 fn serialize_usize(&mut self, v: usize) -> Result<()> {
64 self.serialize_vec(compress_usize(v))?;
65 Ok(())
66 }
67}
68
69impl<'se> ser::Serializer for &mut Serializer<'se> {
70 type Ok = ();
71 type Error = BinaryError;
72
73 type SerializeSeq = Self;
74 type SerializeTuple = Self;
75 type SerializeTupleStruct = Self;
76 type SerializeTupleVariant = Self;
77 type SerializeMap = Self;
78 type SerializeStruct = Self;
79 type SerializeStructVariant = Self;
80
81 fn serialize_bool(self, v: bool) -> Result<Self::Ok> {
82 self.serialize_u8(if v { 1 } else { 0 })
83 }
84
85 fn serialize_u8(self, v: u8) -> Result<Self::Ok> {
86 self.serialize_num(v)
87 }
88
89 fn serialize_u16(self, v: u16) -> Result<Self::Ok> {
90 self.serialize_num(v)
91 }
92
93 fn serialize_u32(self, v: u32) -> Result<Self::Ok> {
94 self.serialize_num(v)
95 }
96
97 fn serialize_u64(self, v: u64) -> Result<Self::Ok> {
98 self.serialize_num(v)
99 }
100
101 fn serialize_u128(self, v: u128) -> Result<Self::Ok> {
102 self.serialize_num(v)
103 }
104
105 fn serialize_i8(self, v: i8) -> Result<Self::Ok> {
106 self.serialize_num(v)
107 }
108
109 fn serialize_i16(self, v: i16) -> Result<Self::Ok> {
110 self.serialize_num(v)
111 }
112
113 fn serialize_i32(self, v: i32) -> Result<Self::Ok> {
114 self.serialize_num(v)
115 }
116
117 fn serialize_i64(self, v: i64) -> Result<Self::Ok> {
118 self.serialize_num(v)
119 }
120
121 fn serialize_i128(self, v: i128) -> Result<Self::Ok> {
122 self.serialize_num(v)
123 }
124
125 fn serialize_f32(self, v: f32) -> Result<Self::Ok> {
126 self.serialize_num(v)
127 }
128
129 fn serialize_f64(self, v: f64) -> Result<Self::Ok> {
130 self.serialize_num(v)
131 }
132
133 fn serialize_char(self, v: char) -> Result<Self::Ok> {
134 let mut buf: [u8; 4] = [0, 0, 0, 0];
135 self.serialize_vec(v.encode_utf8(&mut buf).as_bytes().to_vec())
136 }
137
138 fn serialize_str(self, v: &str) -> Result<Self::Ok> {
139 self.serialize_usize(v.bytes().len()).unwrap();
140 self.serialize_vec(v.as_bytes().to_vec())
141 }
142
143 fn serialize_bytes(self, v: &[u8]) -> Result<Self::Ok> {
144 self.serialize_vec(v.to_vec())
145 }
146
147 fn serialize_none(self) -> Result<Self::Ok> {
148 self.serialize_u8(flags::NONE)
149 }
150
151 fn serialize_some<T>(self, value: &T) -> Result<Self::Ok>
152 where
153 T: ?Sized + ser::Serialize,
154 {
155 self.serialize_u8(flags::SOME).unwrap();
156 value.serialize(self)
157 }
158
159 fn serialize_unit(self) -> Result<Self::Ok> {
160 Ok(())
161 }
162
163 fn serialize_unit_struct(self, _name: &'static str) -> Result<Self::Ok> {
164 Ok(())
165 }
166
167 fn serialize_unit_variant(
168 self,
169 _name: &'static str,
170 variant_index: u32,
171 _variant: &'static str,
172 ) -> Result<Self::Ok> {
173 UNIT_VARIANT.serialize(&mut *self).unwrap();
174 variant_index.serialize(&mut *self)
175 }
176
177 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<Self::Ok>
178 where
179 T: ?Sized + ser::Serialize,
180 {
181 value.serialize(self)
182 }
183
184 fn serialize_newtype_variant<T>(
185 self,
186 _name: &'static str,
187 variant_index: u32,
188 _variant: &'static str,
189 value: &T,
190 ) -> Result<Self::Ok>
191 where
192 T: ?Sized + ser::Serialize,
193 {
194 NONUNIT_VARIANT.serialize(&mut *self).unwrap();
195 variant_index.serialize(&mut *self).unwrap();
196 value.serialize(self)
197 }
198
199 fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq> {
200 match len {
201 Some(n) => {
202 self.serialize_usize(n).unwrap();
203 self.unsized_seq = false;
204 }
205 None => unimplemented!(),
206 }
207 Ok(self)
208 }
209
210 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
211 self.serialize_seq(Some(len))
212 }
213
214 fn serialize_tuple_struct(
215 self,
216 _name: &'static str,
217 len: usize,
218 ) -> Result<Self::SerializeTupleStruct> {
219 self.serialize_seq(Some(len))
220 }
221
222 fn serialize_tuple_variant(
223 self,
224 _name: &'static str,
225 variant_index: u32,
226 _variant: &'static str,
227 len: usize,
228 ) -> Result<Self::SerializeTupleVariant> {
229 NONUNIT_VARIANT.serialize(&mut *self).unwrap();
230 variant_index.serialize(&mut *self).unwrap();
231 self.serialize_usize(len).unwrap();
232 Ok(self)
233 }
234
235 fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap> {
236 match len {
237 Some(n) => {
238 self.serialize_vec(compress_usize(n)).unwrap();
239 Ok(self)
240 }
241 None => unimplemented!(),
244 }
245 }
246
247 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
248 self.serialize_usize(len).unwrap();
249 Ok(self)
250 }
251
252 fn serialize_struct_variant(
253 self,
254 _name: &'static str,
255 variant_index: u32,
256 _variant: &'static str,
257 len: usize,
258 ) -> Result<Self::SerializeStructVariant> {
259 STRUCT_VARIANT.serialize(&mut *self).unwrap();
260 variant_index.serialize(&mut *self).unwrap();
261 self.serialize_usize(len).unwrap();
262 Ok(self)
263 }
264}
265
266impl<'se> ser::SerializeSeq for &mut Serializer<'se> {
267 type Ok = ();
268 type Error = BinaryError;
269
270 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
271 where
272 T: ?Sized + Serialize,
273 {
274 value.serialize(&mut **self)
275 }
276
277 fn end(self) -> Result<()> {
279 Ok(())
280 }
281}
282
283impl<'se> ser::SerializeTuple for &mut Serializer<'se> {
284 type Ok = ();
285 type Error = BinaryError;
286
287 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
288 where
289 T: ?Sized + Serialize,
290 {
291 value.serialize(&mut **self)
292 }
293
294 fn end(self) -> Result<()> {
295 Ok(())
296 }
297}
298
299impl<'se> ser::SerializeTupleStruct for &mut Serializer<'se> {
300 type Ok = ();
301 type Error = BinaryError;
302
303 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
304 where
305 T: ?Sized + Serialize,
306 {
307 value.serialize(&mut **self)
308 }
309
310 fn end(self) -> Result<()> {
311 Ok(())
312 }
313}
314
315impl<'se> ser::SerializeTupleVariant for &mut Serializer<'se> {
316 type Ok = ();
317 type Error = BinaryError;
318
319 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
320 where
321 T: ?Sized + Serialize,
322 {
323 value.serialize(&mut **self)
324 }
325
326 fn end(self) -> Result<()> {
327 Ok(())
328 }
329}
330
331impl<'se> ser::SerializeMap for &mut Serializer<'se> {
332 type Ok = ();
333 type Error = BinaryError;
334
335 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
336 where
337 T: ?Sized + Serialize,
338 {
339 key.serialize(&mut **self)
340 }
341
342 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
343 where
344 T: ?Sized + Serialize,
345 {
346 value.serialize(&mut **self)
347 }
348
349 fn end(self) -> Result<()> {
350 Ok(())
351 }
352}
353
354impl<'se> ser::SerializeStruct for &mut Serializer<'se> {
355 type Ok = ();
356 type Error = BinaryError;
357
358 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<()>
359 where
360 T: ?Sized + Serialize,
361 {
362 value.serialize(&mut **self)
363 }
364
365 fn end(self) -> Result<()> {
366 Ok(())
367 }
368}
369
370impl<'se> ser::SerializeStructVariant for &mut Serializer<'se> {
371 type Ok = ();
372 type Error = BinaryError;
373
374 fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<()>
375 where
376 T: ?Sized + Serialize,
377 {
378 value.serialize(&mut **self)
379 }
380
381 fn end(self) -> Result<()> {
382 Ok(())
383 }
384}