1use crate::{constants::*, Error, Result};
2use serde::{ser, Serialize};
3use std::{convert::TryFrom, io::Write};
4
5pub fn to_vec<T>(value: &T) -> Result<Vec<u8>>
7where
8 T: ?Sized + Serialize,
9{
10 let mut writer = Vec::new();
11 to_writer(&mut writer, value)?;
12 Ok(writer)
13}
14
15pub fn to_writer<W, T>(writer: W, value: &T) -> Result<()>
17where
18 W: Write,
19 T: ?Sized + Serialize,
20{
21 let mut ser = Serializer::new(writer);
22 value.serialize(&mut ser)
23}
24
25pub struct Serializer<W>
27where
28 W: Write,
29{
30 writer: W,
31}
32
33impl<W> Serializer<W>
34where
35 W: Write,
36{
37 pub fn new(writer: W) -> Self {
39 Self { writer }
40 }
41
42 pub fn into_inner(self) -> W {
44 self.writer
45 }
46}
47
48impl<'a, W> ser::Serializer for &'a mut Serializer<W>
49where
50 W: Write,
51{
52 type Ok = ();
53 type Error = Error;
54
55 type SerializeSeq = Self;
56 type SerializeTuple = Self;
57 type SerializeTupleStruct = Self;
58 type SerializeTupleVariant = Self;
59 type SerializeMap = Self;
60 type SerializeStruct = Self;
61 type SerializeStructVariant = Self;
62
63 fn serialize_bool(self, value: bool) -> Result<()> {
64 Ok(self.writer.write_all(&[TYPE_BOOLEAN | value as u8])?)
65 }
66
67 fn serialize_i8(self, value: i8) -> Result<()> {
68 self.serialize_i64(value as i64)
69 }
70
71 fn serialize_i16(self, value: i16) -> Result<()> {
72 self.serialize_i64(value as i64)
73 }
74
75 fn serialize_i32(self, value: i32) -> Result<()> {
76 self.serialize_i64(value as i64)
77 }
78
79 fn serialize_i64(self, value: i64) -> Result<()> {
80 write_integer(&mut self.writer, TYPE_INTEGER, value)
81 }
82
83 fn serialize_u8(self, value: u8) -> Result<()> {
84 self.serialize_i64(value as i64)
85 }
86
87 fn serialize_u16(self, value: u16) -> Result<()> {
88 self.serialize_i64(value as i64)
89 }
90
91 fn serialize_u32(self, value: u32) -> Result<()> {
92 self.serialize_i64(value as i64)
93 }
94
95 fn serialize_u64(self, value: u64) -> Result<()> {
96 self.serialize_i64(i64::try_from(value)?)
97 }
98
99 fn serialize_f32(self, value: f32) -> Result<()> {
100 self.serialize_f64(value as f64)
101 }
102
103 fn serialize_f64(self, value: f64) -> Result<()> {
104 self.writer.write_all(&[TYPE_FLOAT | 8])?;
105 Ok(self.writer.write_all(&value.to_be_bytes())?)
106 }
107
108 fn serialize_char(self, value: char) -> Result<()> {
109 self.serialize_i64(value as i64)
110 }
111
112 fn serialize_str(self, value: &str) -> Result<()> {
113 write_integer(&mut self.writer, TYPE_STRING, value.len() as i64)?;
114 Ok(self.writer.write_all(value.as_bytes())?)
115 }
116
117 fn serialize_bytes(self, value: &[u8]) -> Result<()> {
118 write_integer(&mut self.writer, TYPE_RAW, value.len() as i64)?;
119 Ok(self.writer.write_all(value)?)
120 }
121
122 fn serialize_unit(self) -> Result<()> {
123 Ok(self.writer.write_all(&[TYPE_NULL])?)
124 }
125
126 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
127 self.serialize_unit()
128 }
129
130 fn serialize_unit_variant(
131 self,
132 _name: &'static str,
133 variant_index: u32,
134 _variant: &'static str,
135 ) -> Result<()> {
136 self.serialize_u32(variant_index)
137 }
138
139 fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
140 where
141 T: ?Sized + Serialize,
142 {
143 value.serialize(self)
144 }
145
146 fn serialize_newtype_variant<T>(
147 self,
148 _name: &'static str,
149 variant_index: u32,
150 _variant: &'static str,
151 value: &T,
152 ) -> Result<()>
153 where
154 T: ?Sized + Serialize,
155 {
156 use ser::SerializeSeq;
157 let mut seq = self.serialize_seq(Some(2))?;
158 seq.serialize_element(&variant_index)?;
159 seq.serialize_element(value)?;
160 seq.end()
161 }
162
163 fn serialize_none(self) -> Result<()> {
164 self.serialize_unit()
165 }
166
167 fn serialize_some<T>(self, value: &T) -> Result<()>
168 where
169 T: ?Sized + Serialize,
170 {
171 value.serialize(self)
172 }
173
174 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
175 self.writer.write_all(&[TYPE_LIST])?;
176 Ok(self)
177 }
178
179 fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple> {
180 self.serialize_seq(Some(len))
181 }
182
183 fn serialize_tuple_struct(
184 self,
185 _name: &'static str,
186 len: usize,
187 ) -> Result<Self::SerializeTupleStruct> {
188 self.serialize_tuple(len)
189 }
190
191 fn serialize_tuple_variant(
192 self,
193 _name: &'static str,
194 variant_index: u32,
195 _variant: &'static str,
196 _len: usize,
197 ) -> Result<Self::SerializeTupleVariant> {
198 use ser::SerializeSeq;
199 let mut seq = self.serialize_seq(None)?;
200 seq.serialize_element(&variant_index)?;
201 Ok(seq)
202 }
203
204 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
205 self.writer.write_all(&[TYPE_DICTIONARY])?;
206 Ok(self)
207 }
208
209 fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
210 self.serialize_tuple(len)
211 }
212
213 fn serialize_struct_variant(
214 self,
215 name: &'static str,
216 variant_index: u32,
217 variant: &'static str,
218 len: usize,
219 ) -> Result<Self::SerializeStructVariant> {
220 self.serialize_tuple_variant(name, variant_index, variant, len)
221 }
222}
223
224impl<'a, W> ser::SerializeSeq for &'a mut Serializer<W>
225where
226 W: Write,
227{
228 type Ok = ();
229 type Error = Error;
230
231 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
232 where
233 T: ?Sized + Serialize,
234 {
235 value.serialize(&mut **self)
236 }
237
238 fn end(self) -> Result<()> {
239 Ok(self.writer.write_all(&[TYPE_END])?)
240 }
241}
242
243impl<'a, W> ser::SerializeTuple for &'a mut Serializer<W>
244where
245 W: Write,
246{
247 type Ok = ();
248 type Error = Error;
249
250 fn serialize_element<T>(&mut self, value: &T) -> Result<()>
251 where
252 T: ?Sized + Serialize,
253 {
254 ser::SerializeSeq::serialize_element(self, value)
255 }
256
257 fn end(self) -> Result<()> {
258 ser::SerializeSeq::end(self)
259 }
260}
261
262impl<'a, W> ser::SerializeTupleStruct for &'a mut Serializer<W>
263where
264 W: Write,
265{
266 type Ok = ();
267 type Error = Error;
268
269 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
270 where
271 T: ?Sized + Serialize,
272 {
273 ser::SerializeSeq::serialize_element(self, value)
274 }
275
276 fn end(self) -> Result<()> {
277 ser::SerializeSeq::end(self)
278 }
279}
280
281impl<'a, W> ser::SerializeTupleVariant for &'a mut Serializer<W>
282where
283 W: Write,
284{
285 type Ok = ();
286 type Error = Error;
287
288 fn serialize_field<T>(&mut self, value: &T) -> Result<()>
289 where
290 T: ?Sized + Serialize,
291 {
292 ser::SerializeSeq::serialize_element(self, value)
293 }
294
295 fn end(self) -> Result<()> {
296 ser::SerializeSeq::end(self)
297 }
298}
299
300impl<'a, W> ser::SerializeMap for &'a mut Serializer<W>
301where
302 W: Write,
303{
304 type Ok = ();
305 type Error = Error;
306
307 fn serialize_key<T>(&mut self, key: &T) -> Result<()>
308 where
309 T: ?Sized + Serialize,
310 {
311 key.serialize(KeySerializer(&mut **self))
312 }
313
314 fn serialize_value<T>(&mut self, value: &T) -> Result<()>
315 where
316 T: ?Sized + Serialize,
317 {
318 value.serialize(&mut **self)
319 }
320
321 fn end(self) -> Result<()> {
322 Ok(self.writer.write_all(&[TYPE_END])?)
323 }
324}
325
326impl<'a, W> ser::SerializeStruct for &'a mut Serializer<W>
327where
328 W: Write,
329{
330 type Ok = ();
331 type Error = Error;
332
333 fn serialize_field<T>(&mut self, _name: &'static str, value: &T) -> Result<()>
334 where
335 T: ?Sized + Serialize,
336 {
337 ser::SerializeSeq::serialize_element(self, value)
338 }
339
340 fn end(self) -> Result<()> {
341 ser::SerializeSeq::end(self)
342 }
343}
344
345impl<'a, W> ser::SerializeStructVariant for &'a mut Serializer<W>
346where
347 W: Write,
348{
349 type Ok = ();
350 type Error = Error;
351
352 fn serialize_field<T>(&mut self, name: &'static str, value: &T) -> Result<()>
353 where
354 T: ?Sized + Serialize,
355 {
356 ser::SerializeStruct::serialize_field(self, name, value)
357 }
358
359 fn end(self) -> Result<()> {
360 ser::SerializeSeq::end(self)
361 }
362}
363
364fn write_integer<W>(writer: &mut W, typ: u8, value: i64) -> Result<()>
365where
366 W: Write,
367{
368 let len = if value >= i8::MIN as i64 && value <= i8::MAX as i64 {
369 1
370 } else if value >= i16::MIN as i64 && value <= i16::MAX as i64 {
371 2
372 } else if value >= i32::MIN as i64 && value <= i32::MAX as i64 {
373 4
374 } else {
375 8
376 };
377 writer.write_all(&[typ | len as u8])?;
378 let start = 8 - len as usize;
379 let mut buf = [0u8; 8];
380 buf[..len].copy_from_slice(&value.to_be_bytes()[start..]);
381 Ok(writer.write_all(&buf[..len])?)
382}
383
384struct KeySerializer<'a, W>(&'a mut Serializer<W>)
385where
386 W: Write;
387
388impl<'a, W> ser::Serializer for KeySerializer<'a, W>
389where
390 W: Write,
391{
392 type Ok = ();
393 type Error = Error;
394
395 type SerializeSeq = ser::Impossible<(), Error>;
396 type SerializeTuple = ser::Impossible<(), Error>;
397 type SerializeTupleStruct = ser::Impossible<(), Error>;
398 type SerializeTupleVariant = ser::Impossible<(), Error>;
399 type SerializeMap = ser::Impossible<(), Error>;
400 type SerializeStruct = ser::Impossible<(), Error>;
401 type SerializeStructVariant = ser::Impossible<(), Error>;
402
403 fn serialize_bool(self, _value: bool) -> Result<()> {
404 Err(Error::WrongType)
405 }
406
407 fn serialize_i8(self, _value: i8) -> Result<()> {
408 Err(Error::WrongType)
409 }
410
411 fn serialize_i16(self, _value: i16) -> Result<()> {
412 Err(Error::WrongType)
413 }
414
415 fn serialize_i32(self, _value: i32) -> Result<()> {
416 Err(Error::WrongType)
417 }
418
419 fn serialize_i64(self, _value: i64) -> Result<()> {
420 Err(Error::WrongType)
421 }
422
423 fn serialize_u8(self, _value: u8) -> Result<()> {
424 Err(Error::WrongType)
425 }
426
427 fn serialize_u16(self, _value: u16) -> Result<()> {
428 Err(Error::WrongType)
429 }
430
431 fn serialize_u32(self, _value: u32) -> Result<()> {
432 Err(Error::WrongType)
433 }
434
435 fn serialize_u64(self, _value: u64) -> Result<()> {
436 Err(Error::WrongType)
437 }
438
439 fn serialize_f32(self, _value: f32) -> Result<()> {
440 Err(Error::WrongType)
441 }
442
443 fn serialize_f64(self, _value: f64) -> Result<()> {
444 Err(Error::WrongType)
445 }
446
447 fn serialize_char(self, _value: char) -> Result<()> {
448 Err(Error::WrongType)
449 }
450
451 fn serialize_str(self, value: &str) -> Result<()> {
452 self.0.serialize_str(value)
453 }
454
455 fn serialize_bytes(self, _value: &[u8]) -> Result<()> {
456 Err(Error::WrongType)
457 }
458
459 fn serialize_unit(self) -> Result<()> {
460 Err(Error::WrongType)
461 }
462
463 fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
464 Err(Error::WrongType)
465 }
466
467 fn serialize_unit_variant(
468 self,
469 _name: &'static str,
470 _variant_index: u32,
471 _variant: &'static str,
472 ) -> Result<()> {
473 Err(Error::WrongType)
474 }
475
476 fn serialize_newtype_struct<T>(self, _name: &'static str, _value: &T) -> Result<()>
477 where
478 T: ?Sized + Serialize,
479 {
480 Err(Error::WrongType)
481 }
482
483 fn serialize_newtype_variant<T>(
484 self,
485 _name: &'static str,
486 _variant_index: u32,
487 _variant: &'static str,
488 _value: &T,
489 ) -> Result<()>
490 where
491 T: ?Sized + Serialize,
492 {
493 Err(Error::WrongType)
494 }
495
496 fn serialize_none(self) -> Result<()> {
497 Err(Error::WrongType)
498 }
499
500 fn serialize_some<T>(self, _value: &T) -> Result<()>
501 where
502 T: ?Sized + Serialize,
503 {
504 Err(Error::WrongType)
505 }
506
507 fn serialize_seq(self, _len: Option<usize>) -> Result<Self::SerializeSeq> {
508 Err(Error::WrongType)
509 }
510
511 fn serialize_tuple(self, _len: usize) -> Result<Self::SerializeTuple> {
512 Err(Error::WrongType)
513 }
514
515 fn serialize_tuple_struct(
516 self,
517 _name: &'static str,
518 _len: usize,
519 ) -> Result<Self::SerializeTupleStruct> {
520 Err(Error::WrongType)
521 }
522
523 fn serialize_tuple_variant(
524 self,
525 _name: &'static str,
526 _variant_index: u32,
527 _variant: &'static str,
528 _len: usize,
529 ) -> Result<Self::SerializeTupleVariant> {
530 Err(Error::WrongType)
531 }
532
533 fn serialize_map(self, _len: Option<usize>) -> Result<Self::SerializeMap> {
534 Err(Error::WrongType)
535 }
536
537 fn serialize_struct(self, _name: &'static str, _len: usize) -> Result<Self::SerializeStruct> {
538 Err(Error::WrongType)
539 }
540
541 fn serialize_struct_variant(
542 self,
543 _name: &'static str,
544 _variant_index: u32,
545 _variant: &'static str,
546 _len: usize,
547 ) -> Result<Self::SerializeStructVariant> {
548 Err(Error::WrongType)
549 }
550}
551
552#[cfg(test)]
553mod test {
554 use super::*;
555 use hex_literal::hex;
556 use serde::Serialize;
557 use std::collections::BTreeMap;
558
559 #[test]
560 fn to_vec_maps() {
561 let mut map = BTreeMap::new();
562 map.insert("foo".to_string(), 123u32);
563 map.insert("bar".to_string(), 456u32);
564 let buf = to_vec(&map).unwrap();
565 assert_eq!(
566 hex!("70 4103626172 2201C8 4103666F6F 217B 80").as_ref(),
567 buf.as_slice()
568 );
569 }
570
571 #[test]
572 fn to_vec_structs() {
573 #[derive(Serialize)]
574 struct Test {
575 x: bool,
576 y: u32,
577 z: Vec<String>,
578 }
579 let s = Test {
580 x: true,
581 y: 17,
582 z: vec!["foo".into(), "bar".into()],
583 };
584 let buf = to_vec(&s).unwrap();
585 assert_eq!(
586 hex!("60 11 2111 60 4103666F6F 4103626172 80 80").as_ref(),
587 buf.as_slice()
588 );
589 }
590
591 #[test]
592 fn to_vec_enums() {
593 #[derive(Serialize)]
594 enum Test {
595 UnitVariant,
596 NewTypeVariant(u32),
597 TupleVariant(bool, u32),
598 StructVariant { x: bool, y: u32 },
599 }
600 let e = Test::UnitVariant;
601 let buf = to_vec(&e).unwrap();
602 assert_eq!(hex!("2100").as_ref(), buf.as_slice());
603
604 let e = Test::NewTypeVariant(17);
605 let buf = to_vec(&e).unwrap();
606 assert_eq!(hex!("60 2101 2111 80").as_ref(), buf.as_slice());
607
608 let e = Test::TupleVariant(true, 17);
609 let buf = to_vec(&e).unwrap();
610 assert_eq!(hex!("60 2102 11 2111 80").as_ref(), buf.as_slice());
611
612 let e = Test::StructVariant { x: true, y: 17 };
613 let buf = to_vec(&e).unwrap();
614 assert_eq!(hex!("60 2103 11 2111 80").as_ref(), buf.as_slice());
615 }
616
617 #[test]
618 fn to_vec_options() {
619 let o: Option<u32> = None;
620 let buf = to_vec(&o).unwrap();
621 assert_eq!(hex!("00").as_ref(), buf.as_slice());
622
623 let o = Some(17);
624 let buf = to_vec(&o).unwrap();
625 assert_eq!(hex!("2111").as_ref(), buf.as_slice());
626 }
627}