bramble_data/
ser.rs

1use crate::{constants::*, Error, Result};
2use serde::{ser, Serialize};
3use std::{convert::TryFrom, io::Write};
4
5/// Serializes a value as BDF into a [`Vec`].
6pub 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
15/// Serializes a value as BDF into a [`Write`](std::io::Write).
16pub 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
25/// A serializer that outputs data as BDF.
26pub struct Serializer<W>
27where
28    W: Write,
29{
30    writer: W,
31}
32
33impl<W> Serializer<W>
34where
35    W: Write,
36{
37    /// Creates a new serializer from a writer.
38    pub fn new(writer: W) -> Self {
39        Self { writer }
40    }
41
42    /// Consumes the serializer and returns the inner writer.
43    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}