cbor_smol/
ser.rs

1use super::error::{Error, Result};
2use serde::ser;
3use serde::Serialize;
4
5use core::mem;
6
7use crate::consts::*;
8
9pub trait Writer {
10    /// The type of error returned when a write operation fails.
11    type Error: Into<Error>;
12
13    /// Attempts to write an entire buffer into this write.
14    fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error>;
15}
16
17impl<'a> Writer for &'a mut [u8] {
18    type Error = Error;
19    fn write_all(&mut self, buf: &[u8]) -> Result<()> {
20        let l = buf.len();
21        if self.len() < l {
22            // This buffer will not fit in our slice
23            return Err(Error::SerializeBufferFull(0));
24        }
25        let (current, rem) = mem::take(self).split_at_mut(l);
26        current.copy_from_slice(buf);
27        *self = rem;
28        Ok(())
29    }
30}
31
32#[cfg(feature = "heapless-bytes-v0-3")]
33impl<const N: usize> Writer for heapless_bytes_v0_3::Bytes<N> {
34    type Error = Error;
35    fn write_all(&mut self, buf: &[u8]) -> Result<()> {
36        self.extend_from_slice(buf)
37            .or(Err(Error::SerializeBufferFull(self.len())))
38    }
39}
40
41#[cfg(feature = "heapless-bytes-v0-4")]
42impl<const N: usize> Writer for heapless_bytes_v0_4::Bytes<N> {
43    type Error = Error;
44    fn write_all(&mut self, buf: &[u8]) -> Result<()> {
45        self.extend_from_slice(buf)
46            .or(Err(Error::SerializeBufferFull(self.len())))
47    }
48}
49
50#[cfg(feature = "heapless-v0-7")]
51impl<const N: usize> Writer for heapless_v0_7::Vec<u8, N> {
52    type Error = Error;
53    fn write_all(&mut self, buf: &[u8]) -> Result<()> {
54        self.extend_from_slice(buf)
55            .or(Err(Error::SerializeBufferFull(self.len())))
56    }
57}
58
59#[cfg(feature = "heapless-v0-8")]
60impl<const N: usize> Writer for heapless_v0_8::Vec<u8, N> {
61    type Error = Error;
62    fn write_all(&mut self, buf: &[u8]) -> Result<()> {
63        self.extend_from_slice(buf)
64            .or(Err(Error::SerializeBufferFull(self.len())))
65    }
66}
67
68impl<'a, T: Writer> Writer for &'a mut T {
69    type Error = T::Error;
70    fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
71        (**self).write_all(buf)
72    }
73}
74
75struct WrittenWriter<W> {
76    writer: W,
77    written: usize,
78}
79
80impl<W: Writer> Writer for WrittenWriter<W> {
81    type Error = W::Error;
82
83    fn write_all(&mut self, buf: &[u8]) -> core::result::Result<(), Self::Error> {
84        self.written += buf.len();
85        self.writer.write_all(buf)
86    }
87}
88
89pub struct Serializer<W> {
90    inner: WrittenWriter<W>,
91}
92
93impl<W: Writer> Serializer<W> {
94    #[inline]
95    pub fn new(writer: W) -> Self {
96        Serializer {
97            inner: WrittenWriter { writer, written: 0 },
98        }
99    }
100
101    pub fn written(&self) -> usize {
102        self.inner.written
103    }
104
105    /// Unwrap the `Writer` from the `Serializer`.
106    #[inline]
107    pub fn into_inner(self) -> W {
108        self.inner.writer
109    }
110
111    #[inline]
112    fn write_u8(&mut self, major: u8, value: u8) -> Result<()> {
113        if value <= 0x17 {
114            self.inner.write_all(&[major << MAJOR_OFFSET | value])
115        } else {
116            let buf = [major << MAJOR_OFFSET | 24, value];
117            self.inner.write_all(&buf)
118        }
119        .map_err(|e| e.into())
120    }
121
122    #[inline]
123    fn write_u16(&mut self, major: u8, value: u16) -> Result<()> {
124        if value <= u16::from(u8::MAX) {
125            self.write_u8(major, value as u8)
126        } else {
127            let mut buf = [major << MAJOR_OFFSET | 25, 0, 0];
128            buf[1..].copy_from_slice(&value.to_be_bytes());
129            self.inner.write_all(&buf).map_err(|e| e.into())
130        }
131    }
132
133    #[inline]
134    fn write_u32(&mut self, major: u8, value: u32) -> Result<()> {
135        if value <= u32::from(u16::MAX) {
136            self.write_u16(major, value as u16)
137        } else {
138            let mut buf = [major << MAJOR_OFFSET | 26, 0, 0, 0, 0];
139            buf[1..].copy_from_slice(&value.to_be_bytes());
140            self.inner.write_all(&buf).map_err(|e| e.into())
141        }
142    }
143
144    #[inline]
145    fn write_u64(&mut self, major: u8, value: u64) -> Result<()> {
146        if value <= u64::from(u32::MAX) {
147            self.write_u32(major, value as u32)
148        } else {
149            let mut buf = [major << MAJOR_OFFSET | 27, 0, 0, 0, 0, 0, 0, 0, 0];
150            buf[1..].copy_from_slice(&value.to_be_bytes());
151            self.inner.write_all(&buf).map_err(|e| e.into())
152        }
153    }
154
155    #[inline]
156    fn serialize_collection(
157        &mut self,
158        major: u8,
159        len: Option<usize>,
160    ) -> Result<CollectionSerializer<'_, W>> {
161        let needs_eof = match len {
162            Some(len) => {
163                self.write_u64(major, len as u64)?;
164                false
165            }
166            None => {
167                self.inner
168                    .write_all(&[major << MAJOR_OFFSET | 31])
169                    .map_err(|e| e.into())?;
170                true
171            }
172        };
173
174        Ok(CollectionSerializer {
175            ser: self,
176            needs_eof,
177        })
178    }
179}
180
181impl<'a, W> ser::Serializer for &'a mut Serializer<W>
182where
183    W: Writer,
184{
185    type Ok = ();
186
187    type Error = Error;
188
189    type SerializeSeq = CollectionSerializer<'a, W>;
190    type SerializeTuple = &'a mut Serializer<W>;
191    type SerializeTupleStruct = &'a mut Serializer<W>;
192    type SerializeTupleVariant = &'a mut Serializer<W>;
193    type SerializeMap = CollectionSerializer<'a, W>;
194    type SerializeStruct = &'a mut Serializer<W>;
195    type SerializeStructVariant = &'a mut Serializer<W>;
196
197    #[inline]
198    fn serialize_bool(self, value: bool) -> Result<()> {
199        let value = if value { VALUE_TRUE } else { VALUE_FALSE };
200        self.inner.write_all(&[value]).map_err(|e| e.into())
201    }
202
203    #[inline]
204    fn serialize_i8(self, value: i8) -> Result<()> {
205        let sign = (value >> 7) as u8;
206        let major_type = sign & 0x1;
207        let bits = sign ^ (value as u8);
208        self.write_u8(major_type, bits)
209    }
210
211    #[inline]
212    fn serialize_i16(self, value: i16) -> Result<()> {
213        let sign = (value >> 15) as u16;
214        let major_type = (sign & 0x1) as u8;
215        let bits = sign ^ (value as u16);
216        self.write_u16(major_type, bits)
217    }
218
219    #[inline]
220    fn serialize_i32(self, value: i32) -> Result<()> {
221        let sign = (value >> 31) as u32;
222        let major_type = (sign & 0x1) as u8;
223        let bits = sign ^ (value as u32);
224        self.write_u32(major_type, bits)
225    }
226
227    #[inline]
228    fn serialize_i64(self, value: i64) -> Result<()> {
229        let sign = (value >> 63) as u64;
230        let major_type = (sign & 0x1) as u8;
231        let bits = sign ^ (value as u64);
232        self.write_u64(major_type, bits)
233    }
234
235    #[inline]
236    fn serialize_u8(self, value: u8) -> Result<()> {
237        self.write_u8(MAJOR_POSINT, value)
238    }
239
240    #[inline]
241    fn serialize_u16(self, value: u16) -> Result<()> {
242        self.write_u16(MAJOR_POSINT, value)
243    }
244
245    #[inline]
246    fn serialize_u32(self, value: u32) -> Result<()> {
247        self.write_u32(MAJOR_POSINT, value)
248    }
249
250    #[inline]
251    fn serialize_u64(self, value: u64) -> Result<()> {
252        self.write_u64(MAJOR_POSINT, value)
253    }
254
255    fn serialize_f32(self, _v: f32) -> Result<()> {
256        todo!("serialize_f32 not implemented");
257    }
258
259    fn serialize_f64(self, _v: f64) -> Result<()> {
260        todo!("serialize_f64 not implemented");
261    }
262
263    #[inline]
264    fn serialize_char(self, value: char) -> Result<()> {
265        // A char encoded as UTF-8 takes 4 bytes at most.
266        let mut buf = [0; 4];
267        self.serialize_str(value.encode_utf8(&mut buf))
268    }
269
270    #[inline]
271    fn serialize_str(self, value: &str) -> Result<()> {
272        self.write_u64(MAJOR_STR, value.len() as u64)?;
273        self.inner.write_all(value.as_bytes()).map_err(|e| e.into())
274    }
275
276    #[inline]
277    fn serialize_bytes(self, value: &[u8]) -> Result<()> {
278        self.write_u64(MAJOR_BYTES, value.len() as u64)?;
279        self.inner.write_all(value).map_err(|e| e.into())
280    }
281
282    #[inline]
283    fn serialize_none(self) -> Result<()> {
284        self.inner.write_all(&[VALUE_NULL]).map_err(|e| e.into())
285    }
286
287    #[inline]
288    fn serialize_some<T>(self, value: &T) -> Result<()>
289    where
290        T: ?Sized + ser::Serialize,
291    {
292        value.serialize(self)
293    }
294
295    #[inline]
296    fn serialize_unit(self) -> Result<()> {
297        self.serialize_none()
298    }
299
300    #[inline]
301    fn serialize_unit_struct(self, _name: &'static str) -> Result<()> {
302        self.serialize_unit()
303    }
304
305    #[inline]
306    fn serialize_unit_variant(
307        self,
308        _name: &'static str,
309        variant_index: u32,
310        _variant: &'static str,
311    ) -> Result<()> {
312        // if self.packed {
313        self.serialize_u32(variant_index)
314        // } else {
315        //     self.serialize_str(variant)
316        // }
317    }
318
319    #[inline]
320    fn serialize_newtype_struct<T>(self, _name: &'static str, value: &T) -> Result<()>
321    where
322        T: ?Sized + ser::Serialize,
323    {
324        // if name == CBOR_NEWTYPE_NAME {
325        //     for tag in get_tag().into_iter() {
326        //         self.write_u64(6, tag)?;
327        //     }
328        // }
329        value.serialize(self)
330    }
331
332    #[inline]
333    fn serialize_newtype_variant<T>(
334        self,
335        name: &'static str,
336        variant_index: u32,
337        variant: &'static str,
338        value: &T,
339    ) -> Result<()>
340    where
341        T: ?Sized + ser::Serialize,
342    {
343        // if self.enum_as_map {
344        //     self.write_u64(5, 1u64)?;
345        //     variant.serialize(&mut *self)?;
346        // } else {
347        self.write_u64(MAJOR_ARRAY, 2)?;
348        self.serialize_unit_variant(name, variant_index, variant)?;
349        // }
350        value.serialize(self)
351    }
352
353    #[inline]
354    fn serialize_seq(self, len: Option<usize>) -> Result<CollectionSerializer<'a, W>> {
355        self.serialize_collection(MAJOR_ARRAY, len)
356    }
357
358    #[inline]
359    fn serialize_tuple(self, len: usize) -> Result<&'a mut Serializer<W>> {
360        self.write_u64(MAJOR_ARRAY, len as u64)?;
361        Ok(self)
362    }
363
364    #[inline]
365    fn serialize_tuple_struct(
366        self,
367        _name: &'static str,
368        len: usize,
369    ) -> Result<&'a mut Serializer<W>> {
370        self.serialize_tuple(len)
371    }
372
373    #[inline]
374    fn serialize_tuple_variant(
375        self,
376        name: &'static str,
377        variant_index: u32,
378        variant: &'static str,
379        len: usize,
380    ) -> Result<&'a mut Serializer<W>> {
381        // if self.enum_as_map {
382        //     self.write_u64(5, 1u64)?;
383        //     variant.serialize(&mut *self)?;
384        //     self.serialize_tuple(len)
385        // } else {
386        self.write_u64(MAJOR_ARRAY, (len + 1) as u64)?;
387        self.serialize_unit_variant(name, variant_index, variant)?;
388        Ok(self)
389        // }
390    }
391
392    #[inline]
393    fn serialize_map(self, len: Option<usize>) -> Result<CollectionSerializer<'a, W>> {
394        self.serialize_collection(MAJOR_MAP, len)
395    }
396
397    #[inline]
398    fn serialize_struct(self, _name: &'static str, len: usize) -> Result<Self::SerializeStruct> {
399        self.write_u64(MAJOR_MAP, len as u64)?;
400        Ok(self)
401    }
402
403    #[inline]
404    fn serialize_struct_variant(
405        self,
406        name: &'static str,
407        variant_index: u32,
408        variant: &'static str,
409        len: usize,
410    ) -> Result<Self::SerializeStruct> {
411        // if self.enum_as_map {
412        //     self.write_u64(5, 1u64)?;
413        // } else {
414        self.write_u64(MAJOR_ARRAY, 2)?;
415        // }
416        self.serialize_unit_variant(name, variant_index, variant)?;
417        self.serialize_struct(name, len)
418    }
419
420    fn collect_str<T>(self, _value: &T) -> Result<Self::Ok>
421    where
422        T: core::fmt::Display + ?Sized,
423    {
424        unreachable!()
425    }
426
427    #[inline]
428    fn is_human_readable(&self) -> bool {
429        false
430    }
431}
432
433impl<'a, W> ser::SerializeTuple for &'a mut Serializer<W>
434where
435    W: Writer,
436{
437    type Ok = ();
438    type Error = Error;
439
440    #[inline]
441    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
442    where
443        T: ?Sized + ser::Serialize,
444    {
445        value.serialize(&mut **self)
446    }
447
448    #[inline]
449    fn end(self) -> Result<()> {
450        Ok(())
451    }
452}
453
454impl<'a, W> ser::SerializeTupleStruct for &'a mut Serializer<W>
455where
456    W: Writer,
457{
458    type Ok = ();
459    type Error = Error;
460
461    #[inline]
462    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
463    where
464        T: ?Sized + ser::Serialize,
465    {
466        value.serialize(&mut **self)
467    }
468
469    #[inline]
470    fn end(self) -> Result<()> {
471        Ok(())
472    }
473}
474
475impl<'a, W> ser::SerializeTupleVariant for &'a mut Serializer<W>
476where
477    W: Writer,
478{
479    type Ok = ();
480    type Error = Error;
481
482    #[inline]
483    fn serialize_field<T>(&mut self, value: &T) -> Result<()>
484    where
485        T: ?Sized + ser::Serialize,
486    {
487        value.serialize(&mut **self)
488    }
489
490    #[inline]
491    fn end(self) -> Result<()> {
492        Ok(())
493    }
494}
495
496impl<'a, W> ser::SerializeStruct for &'a mut Serializer<W>
497where
498    W: Writer,
499{
500    type Ok = ();
501    type Error = Error;
502
503    #[inline]
504    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
505    where
506        T: ?Sized + ser::Serialize,
507    {
508        key.serialize(&mut **self)?;
509        value.serialize(&mut **self)?;
510        Ok(())
511    }
512
513    #[inline]
514    fn end(self) -> Result<()> {
515        Ok(())
516    }
517}
518
519impl<'a, W> ser::SerializeStructVariant for &'a mut Serializer<W>
520where
521    W: Writer,
522{
523    type Ok = ();
524    type Error = Error;
525
526    #[inline]
527    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<()>
528    where
529        T: ?Sized + ser::Serialize,
530    {
531        key.serialize(&mut **self)?;
532        value.serialize(&mut **self)?;
533        Ok(())
534    }
535
536    #[inline]
537    fn end(self) -> Result<()> {
538        Ok(())
539    }
540}
541
542#[doc(hidden)]
543pub struct CollectionSerializer<'a, W> {
544    ser: &'a mut Serializer<W>,
545    needs_eof: bool,
546}
547
548impl<'a, W> CollectionSerializer<'a, W>
549where
550    W: Writer,
551{
552    #[inline]
553    fn end_inner(self) -> Result<()> {
554        if self.needs_eof {
555            self.ser.inner.write_all(&[0xff]).map_err(|e| e.into())
556        } else {
557            Ok(())
558        }
559    }
560}
561
562impl<'a, W> ser::SerializeSeq for CollectionSerializer<'a, W>
563where
564    W: Writer,
565{
566    type Ok = ();
567    type Error = Error;
568
569    #[inline]
570    fn serialize_element<T>(&mut self, value: &T) -> Result<()>
571    where
572        T: ?Sized + ser::Serialize,
573    {
574        value.serialize(&mut *self.ser)
575    }
576
577    #[inline]
578    fn end(self) -> Result<()> {
579        self.end_inner()
580    }
581}
582
583impl<'a, W> ser::SerializeMap for CollectionSerializer<'a, W>
584where
585    W: Writer,
586{
587    type Ok = ();
588    type Error = Error;
589
590    #[inline]
591    fn serialize_key<T>(&mut self, key: &T) -> Result<()>
592    where
593        T: ?Sized + ser::Serialize,
594    {
595        key.serialize(&mut *self.ser)
596    }
597
598    #[inline]
599    fn serialize_value<T>(&mut self, value: &T) -> Result<()>
600    where
601        T: ?Sized + ser::Serialize,
602    {
603        value.serialize(&mut *self.ser)
604    }
605
606    #[inline]
607    fn end(self) -> Result<()> {
608        self.end_inner()
609    }
610}