cbor_smol/
ser.rs

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