ser_write_msgpack/
ser.rs

1//! MessagePack serde serializer for `ser-write`
2use core::fmt;
3
4#[cfg(feature = "std")]
5use std::{vec::Vec, string::{String, ToString}};
6
7#[cfg(all(feature = "alloc",not(feature = "std")))]
8use alloc::{vec::Vec, string::{String, ToString}};
9
10use serde::{ser, Serialize};
11use ser::Serializer as _;
12
13use super::magick::*;
14
15use ser_write::SerWrite;
16
17/// MessagePack serializer serializing structs to arrays and enum variants as indexes.
18///
19/// **Warning**: with this serializer only last fields can be skipped from a data structure.
20pub struct CompactSerializer<W> {
21    output: W
22}
23
24/// MessagePack serializer serializing structs to maps with fields and enum variants as indexes
25pub struct StructMapIdxSerializer<W> {
26    output: W
27}
28
29/// MessagePack serializer serializing structs to maps with field names and enum variants as names
30pub struct StructMapStrSerializer<W> {
31    output: W
32}
33
34#[cfg(any(feature = "std", feature = "alloc"))]
35#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
36pub fn to_vec<T>(value: &T) -> Result<Vec<u8>, ser_write::SerError>
37    where T: Serialize + ?Sized
38{
39    let mut vec = Vec::new();
40    to_writer(&mut vec, value)?;
41    Ok(vec)
42}
43
44#[cfg(any(feature = "std", feature = "alloc"))]
45#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
46pub fn to_vec_compact<T>(value: &T) -> Result<Vec<u8>, ser_write::SerError>
47    where T: Serialize + ?Sized
48{
49    let mut vec = Vec::new();
50    to_writer_compact(&mut vec, value)?;
51    Ok(vec)
52}
53
54#[cfg(any(feature = "std", feature = "alloc"))]
55#[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
56pub fn to_vec_named<T>(value: &T) -> Result<Vec<u8>, ser_write::SerError>
57    where T: Serialize + ?Sized
58{
59    let mut vec = Vec::new();
60    to_writer_named(&mut vec, value)?;
61    Ok(vec)
62}
63
64/// Serialize `value` as a MessagePack message to a [`SerWrite`] implementation.
65///
66/// Serialize data structures as arrays without field names and enum variants as indexes.
67///
68/// **Warning**: with this function only last fields can be skipped from a data structure.
69pub fn to_writer_compact<W, T>(writer: W, value: &T) -> Result<(), W::Error>
70    where W: SerWrite,
71          <W as SerWrite>::Error: fmt::Display+fmt::Debug,
72          T: Serialize + ?Sized
73{
74    let mut serializer = CompactSerializer::new(writer);
75    value.serialize(&mut serializer)
76}
77
78/// Serialize `value` as a MessagePack message to a [`SerWrite`] implementation.
79///
80/// Serialize data structures as maps with field and enum variants as indexes.
81pub fn to_writer<W, T>(writer: W, value: &T) -> Result<(), W::Error>
82    where W: SerWrite,
83          <W as SerWrite>::Error: fmt::Display+fmt::Debug,
84          T: Serialize + ?Sized
85{
86    let mut serializer = StructMapIdxSerializer::new(writer);
87    value.serialize(&mut serializer)
88}
89
90/// Serialize `value` as a MessagePack message to a [`SerWrite`] implementation.
91///
92/// Serialize data structures as maps where resulting message will contain field and enum variant names.
93pub fn to_writer_named<W, T>(writer: W, value: &T) -> Result<(), W::Error>
94    where W: SerWrite,
95          <W as SerWrite>::Error: fmt::Display+fmt::Debug,
96          T: Serialize + ?Sized
97{
98    let mut serializer = StructMapStrSerializer::new(writer);
99    value.serialize(&mut serializer)
100}
101
102/// Serializing error
103#[derive(Debug, Clone, PartialEq, Eq, Hash)]
104#[non_exhaustive]
105pub enum Error<E> {
106    /// Writer error
107    Writer(E),
108    /// Undetermined map length or too many items
109    MapLength,
110    /// Undetermined sequence length or too many items
111    SeqLength,
112    /// String size too large
113    StrLength,
114    /// Byte-array size too large
115    DataLength,
116    /// Skipped a field in a struct using compact serializer
117    FieldSkipped,
118    /// Error formatting a collected string
119    FormatError,
120    #[cfg(any(feature = "std", feature = "alloc"))]
121    #[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
122    /// An error passed down from a [`serde::ser::Serialize`] implementation
123    SerializeError(String),
124    #[cfg(not(any(feature = "std", feature = "alloc")))]
125    SerializeError
126}
127
128/// Serialization result
129pub type Result<T, E> = core::result::Result<T, Error<E>>;
130
131impl<E: fmt::Display+fmt::Debug> serde::de::StdError for Error<E> {}
132
133impl<E: fmt::Display> fmt::Display for Error<E> {
134    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
135        match self {
136            Error::Writer(err) => err.fmt(f),
137            Error::MapLength => f.write_str("unknown or invalid map length"),
138            Error::SeqLength => f.write_str("unknown or invalid sequence length"),
139            Error::StrLength => f.write_str("invalid string length"),
140            Error::DataLength => f.write_str("invalid byte array length"),
141            Error::FieldSkipped => f.write_str("skipped a field in a middle of struct"),
142            Error::FormatError => f.write_str("error collecting a string"),
143            #[cfg(any(feature = "std", feature = "alloc"))]
144            Error::SerializeError(s) => write!(f, "{} while serializing MessagePack", s),
145            #[cfg(not(any(feature = "std", feature = "alloc")))]
146            Error::SerializeError => f.write_str("error while serializing MessagePack"),
147        }
148    }
149}
150
151#[cfg(any(feature = "std", feature = "alloc"))]
152impl<E: fmt::Display+fmt::Debug> serde::ser::Error for Error<E> {
153    fn custom<T>(msg: T) -> Self
154        where T: fmt::Display
155    {
156        Error::SerializeError(msg.to_string())
157    }
158}
159
160#[cfg(not(any(feature = "std", feature = "alloc")))]
161impl<E: fmt::Display+fmt::Debug> serde::ser::Error for Error<E> {
162    fn custom<T>(_msg: T) -> Self
163        where T: fmt::Display
164    {
165        Error::SerializeError
166    }
167}
168
169impl<E> From<E> for Error<E> {
170    fn from(err: E) -> Self {
171        Error::Writer(err)
172    }
173}
174
175impl<W: SerWrite> StructMapIdxSerializer<W> {
176    fn serialize_variant(&mut self, variant_index: u32, _variant_name: &'static str) -> Result<(), W::Error> {
177        write_u32(&mut self.output, variant_index)
178    }
179
180    fn serialize_struct(&mut self, len: usize) -> Result<SerializeStructIntMap<'_, StructMapIdxSerializer<W>>, W::Error> {
181        write_map_len(&mut self.output, len)?;
182        Ok(SerializeStructIntMap { ser: self, len, idx: 0 })
183    }
184}
185
186impl<W: SerWrite> CompactSerializer<W> {
187    fn serialize_variant(&mut self, variant_index: u32, _variant_name: &'static str) -> Result<(), W::Error> {
188        write_u32(&mut self.output, variant_index)
189    }
190
191    fn serialize_struct(&mut self, len: usize) -> Result<SerializeStructArray<'_, CompactSerializer<W>>, W::Error> {
192        write_array_len(&mut self.output, len)?;
193        Ok(SerializeStructArray { ser: self, len })
194    }
195}
196
197impl<W: SerWrite> StructMapStrSerializer<W> {
198    fn serialize_variant(&mut self, _variant_index: u32, variant_name: &'static str) -> Result<(), W::Error> {
199        write_str(&mut self.output, variant_name)
200    }
201
202    fn serialize_struct(&mut self, len: usize) -> Result<SerializeStructStrMap<'_, StructMapStrSerializer<W>>, W::Error> {
203        write_map_len(&mut self.output, len)?;
204        Ok(SerializeStructStrMap { ser: self, len })
205    }
206}
207
208macro_rules! implement_serializer {
209    ($serializer:ident, $struct_serializer:ident) => {
210
211impl<W> $serializer<W> {
212    /// Create a new `Serializer` with the given `output` that should implement [`SerWrite`].
213    #[inline(always)]
214    pub fn new(output: W) -> Self {
215        $serializer { output }
216    }
217    /// Destruct self returning the `output` object.
218    #[inline(always)]
219    pub fn into_inner(self) -> W {
220        self.output
221    }
222    /// Provide access to the inner writer.
223    #[inline(always)]
224    pub fn writer(&mut self) -> &mut W {
225        &mut self.output
226    }
227}
228
229impl<'a, W: SerWrite> ser::Serializer for &'a mut $serializer<W>
230    where <W as SerWrite>::Error: fmt::Display+fmt::Debug
231{
232    type Ok = ();
233    type Error = Error<W::Error>;
234
235    type SerializeSeq = SerializeSeqMap<'a, $serializer<W>>;
236    type SerializeTuple = SerializeSeqMap<'a, $serializer<W>>;
237    type SerializeTupleStruct = SerializeSeqMap<'a, $serializer<W>>;
238    type SerializeTupleVariant = SerializeSeqMap<'a, $serializer<W>>;
239    type SerializeMap = SerializeSeqMap<'a, $serializer<W>>;
240    type SerializeStruct = $struct_serializer<'a, $serializer<W>>;
241    type SerializeStructVariant = $struct_serializer<'a, $serializer<W>>;
242
243    fn is_human_readable(&self) -> bool {
244        false
245    }
246
247    fn serialize_bool(self, v: bool) -> Result<(), W::Error> {
248        Ok(self.output.write_byte(if v { TRUE } else { FALSE })?)
249    }
250    #[inline(always)]
251    fn serialize_i8(self, v: i8) -> Result<(), W::Error> {
252        if v >= MIN_NEGFIXINT {
253            self.output.write_byte(v as u8)?;
254        }
255        else {
256            self.output.write_byte(INT_8)?;
257            self.output.write_byte(v as u8)?;
258        }
259        Ok(())
260    }
261    #[inline(always)]
262    fn serialize_i16(self, v: i16) -> Result<(), W::Error> {
263        if FIXINT_I16.contains(&v) {
264            self.output.write_byte(v as u8)?;
265        }
266        else if let Ok(v) = i8::try_from(v) {
267            self.output.write_byte(INT_8)?;
268            self.output.write_byte(v as u8)?;
269        }
270        else if let Ok(v) = u8::try_from(v) {
271            self.output.write_byte(UINT_8)?;
272            self.output.write_byte(v)?;
273        }
274        else {
275            self.output.write_byte(INT_16)?;
276            self.output.write(&v.to_be_bytes())?;
277        }
278        Ok(())
279    }
280    #[inline]
281    fn serialize_i32(self, v: i32) -> Result<(), W::Error> {
282        if FIXINT_I32.contains(&v) {
283            self.output.write_byte(v as u8)?;
284        }
285        else if let Ok(v) = i8::try_from(v) {
286            self.output.write_byte(INT_8)?;
287            self.output.write_byte(v as u8)?;
288        }
289        else if let Ok(v) = u8::try_from(v) {
290            self.output.write_byte(UINT_8)?;
291            self.output.write_byte(v)?;
292        }
293        else if let Ok(v) = i16::try_from(v) {
294            self.output.write_byte(INT_16)?;
295            self.output.write(&v.to_be_bytes())?;
296        }
297        else if let Ok(v) = u16::try_from(v) {
298            self.output.write_byte(UINT_16)?;
299            self.output.write(&v.to_be_bytes())?;
300        }
301        else {
302            self.output.write_byte(INT_32)?;
303            self.output.write(&v.to_be_bytes())?;
304        }
305        Ok(())
306    }
307
308    fn serialize_i64(self, v: i64) -> Result<(), W::Error> {
309        if FIXINT_I64.contains(&v) {
310            self.output.write_byte(v as u8)?;
311        }
312        else if let Ok(v) = i8::try_from(v) {
313            self.output.write_byte(INT_8)?;
314            self.output.write_byte(v as u8)?;
315        }
316        else if let Ok(v) = u8::try_from(v) {
317            self.output.write_byte(UINT_8)?;
318            self.output.write_byte(v)?;
319        }
320        else if let Ok(v) = i16::try_from(v) {
321            self.output.write_byte(INT_16)?;
322            self.output.write(&v.to_be_bytes())?;
323        }
324        else if let Ok(v) = u16::try_from(v) {
325            self.output.write_byte(UINT_16)?;
326            self.output.write(&v.to_be_bytes())?;
327        }
328        else if let Ok(v) = i32::try_from(v) {
329            self.output.write_byte(INT_32)?;
330            self.output.write(&v.to_be_bytes())?;
331        }
332        else if let Ok(v) = u32::try_from(v) {
333            self.output.write_byte(UINT_32)?;
334            self.output.write(&v.to_be_bytes())?;
335        }
336        else {
337            self.output.write_byte(INT_64)?;
338            self.output.write(&v.to_be_bytes())?;
339        }
340        Ok(())
341    }
342
343    fn serialize_u8(self, v: u8) -> Result<(), W::Error> {
344        if v <= MAX_POSFIXINT {
345            self.output.write_byte(v)?;
346        }
347        else {
348            self.output.write_byte(UINT_8)?;
349            self.output.write_byte(v)?;
350        }
351        Ok(())
352    }
353
354    fn serialize_u16(self, v: u16) -> Result<(), W::Error> {
355        if v <= MAX_POSFIXINT as u16 {
356            self.output.write_byte(v as u8)?;
357        }
358        else if let Ok(v) = u8::try_from(v) {
359            self.output.write_byte(UINT_8)?;
360            self.output.write_byte(v)?;
361        }
362        else {
363            self.output.write_byte(UINT_16)?;
364            self.output.write(&v.to_be_bytes())?;
365        }
366        Ok(())
367    }
368
369    fn serialize_u32(self, v: u32) -> Result<Self::Ok, W::Error> {
370        write_u32(&mut self.output, v)
371    }
372
373    fn serialize_u64(self, v: u64) -> Result<Self::Ok, W::Error> {
374        if v <= MAX_POSFIXINT as u64 {
375            self.output.write_byte(v as u8)?;
376        }
377        else if let Ok(v) = u8::try_from(v) {
378            self.output.write_byte(UINT_8)?;
379            self.output.write_byte(v)?;
380        }
381        else if let Ok(v) = u16::try_from(v) {
382            self.output.write_byte(UINT_16)?;
383            self.output.write(&v.to_be_bytes())?;
384        }
385        else if let Ok(v) = u32::try_from(v) {
386            self.output.write_byte(UINT_32)?;
387            self.output.write(&v.to_be_bytes())?;
388        }
389        else {
390            self.output.write_byte(UINT_64)?;
391            self.output.write(&v.to_be_bytes())?;
392        }
393        Ok(())
394    }
395
396    fn serialize_f32(self, v: f32) -> Result<(), W::Error> {
397        self.output.write_byte(FLOAT_32)?;
398        Ok(self.output.write(&v.to_be_bytes())?)
399    }
400
401    fn serialize_f64(self, v: f64) -> Result<(), W::Error> {
402        self.output.write_byte(FLOAT_64)?;
403        Ok(self.output.write(&v.to_be_bytes())?)
404    }
405
406    fn serialize_char(self, v: char) -> Result<(), W::Error> {
407        let mut encoding_tmp = [0u8; 4];
408        let encoded = v.encode_utf8(&mut encoding_tmp);
409        self.serialize_str(encoded)
410    }
411
412    fn serialize_str(self, v: &str) -> Result<(), W::Error> {
413        write_str(&mut self.output, v)
414    }
415
416    fn serialize_bytes(self, v: &[u8]) -> Result<(), W::Error> {
417        let size = v.len();
418        if let Ok(size) = u8::try_from(size) {
419            self.output.write_byte(BIN_8)?;
420            self.output.write_byte(size)?;
421        }
422        else if let Ok(size) = u16::try_from(size) {
423            self.output.write_byte(BIN_16)?;
424            self.output.write(&size.to_be_bytes())?;
425        }
426        else if let Ok(size) = u32::try_from(size) {
427            self.output.write_byte(BIN_32)?;
428            self.output.write(&size.to_be_bytes())?;
429        }
430        else {
431            return Err(Error::DataLength)
432        }
433        Ok(self.output.write(v)?)
434    }
435
436    fn serialize_none(self) -> Result<(), W::Error> {
437        Ok(self.output.write_byte(NIL)?)
438    }
439
440    fn serialize_some<T>(self, value: &T) -> Result<(), W::Error>
441        where T: ?Sized + Serialize
442    {
443        value.serialize(self)
444    }
445
446    fn serialize_unit(self) -> Result<(), W::Error> {
447        self.serialize_none()
448    }
449
450    fn serialize_unit_struct(self, _name: &'static str) -> Result<(), W::Error> {
451        self.serialize_unit()
452    }
453
454    fn serialize_unit_variant(
455        self,
456        _name: &'static str,
457        variant_index: u32,
458        variant: &'static str,
459    ) -> Result<(), W::Error> {
460        self.serialize_variant(variant_index, variant)
461    }
462
463    fn serialize_newtype_struct<T>(
464        self,
465        _name: &'static str,
466        value: &T,
467    ) -> Result<(), W::Error>
468        where T: ?Sized + Serialize
469    {
470        value.serialize(self)
471    }
472
473    fn serialize_newtype_variant<T>(
474        self,
475        _name: &'static str,
476        variant_index: u32,
477        variant: &'static str,
478        value: &T,
479    ) -> Result<(), W::Error>
480    where
481        T: ?Sized + Serialize,
482    {
483        self.output.write_byte(FIXMAP|1)?;
484        self.serialize_variant(variant_index, variant)?;
485        value.serialize(&mut *self)
486    }
487
488    fn serialize_seq(self, len: Option<usize>) -> Result<Self::SerializeSeq, W::Error> {
489        let len = len.ok_or(Error::SeqLength)?;
490        write_array_len(&mut self.output, len)?;
491        Ok(SerializeSeqMap { len, ser: self })
492    }
493
494    fn serialize_tuple(self, len: usize) -> Result<Self::SerializeTuple, W::Error> {
495        write_array_len(&mut self.output, len)?;
496        Ok(SerializeSeqMap { len, ser: self })
497    }
498
499    fn serialize_tuple_struct(
500        self,
501        _name: &'static str,
502        len: usize,
503    ) -> Result<Self::SerializeTupleStruct, W::Error> {
504        self.serialize_tuple(len)
505    }
506
507    // Tuple variants are represented in JSON as `{ NAME: [ ... ] }`.
508    // This is the externally tagged representation.
509    fn serialize_tuple_variant(
510        self,
511        _name: &'static str,
512        variant_index: u32,
513        variant: &'static str,
514        len: usize,
515    ) -> Result<Self::SerializeTupleVariant, W::Error> {
516        self.output.write_byte(FIXMAP|1)?;
517        self.serialize_variant(variant_index, variant)?;
518        self.serialize_tuple(len)
519    }
520
521    fn serialize_map(self, len: Option<usize>) -> Result<Self::SerializeMap, W::Error> {
522        let len = len.ok_or(Error::MapLength)?;
523        write_map_len(&mut self.output, len)?;
524        Ok(SerializeSeqMap { len, ser: self })
525    }
526
527    fn serialize_struct(
528        self,
529        _name: &'static str,
530        len: usize,
531    ) -> Result<Self::SerializeStruct, W::Error> {
532        self.serialize_struct(len)
533    }
534
535    // Struct variants are represented in JSON as `{ NAME: { K: V, ... } }`.
536    // This is the externally tagged representation.
537    fn serialize_struct_variant(
538        self,
539        _name: &'static str,
540        variant_index: u32,
541        variant: &'static str,
542        len: usize,
543    ) -> Result<Self::SerializeStructVariant, W::Error> {
544        self.output.write_byte(FIXMAP|1)?;
545        self.serialize_variant(variant_index, variant)?;
546        self.serialize_struct(len)
547    }
548
549    #[cfg(any(feature = "std", feature = "alloc"))]
550    fn collect_str<T>(self, value: &T) -> Result<Self::Ok, W::Error>
551        where T: fmt::Display + ?Sized
552    {
553        self.serialize_str(&value.to_string())
554    }
555
556    #[cfg(not(any(feature = "std", feature = "alloc")))]
557    /// This implementation will format the value string twice, once to establish its size and later to actually
558    /// write the string.
559    fn collect_str<T>(self, value: &T) -> Result<Self::Ok, W::Error>
560        where T: fmt::Display + ?Sized
561    {
562        let mut col = StringLenCounter(0);
563        fmt::write(&mut col, format_args!("{}", value)).map_err(|_| Error::FormatError)?;
564        let StringLenCounter(len) = col;
565        write_str_len(&mut self.output, len)?;
566        let mut col = StringCollector::new(len, &mut self.output);
567        fmt::write(&mut col, format_args!("{}", value)).map_err(|_| Error::FormatError)
568    }
569}
570
571};
572} /* implement_serializer */
573
574implement_serializer!(CompactSerializer, SerializeStructArray);
575implement_serializer!(StructMapIdxSerializer, SerializeStructIntMap);
576implement_serializer!(StructMapStrSerializer, SerializeStructStrMap);
577
578#[inline]
579fn write_u32<W: SerWrite>(output: &mut W, v: u32) -> Result<(), W::Error> {
580    if v <= MAX_POSFIXINT as u32 {
581        output.write_byte(v as u8)?;
582    }
583    else if let Ok(v) = u8::try_from(v) {
584        output.write_byte(UINT_8)?;
585        output.write_byte(v)?;
586    }
587    else if let Ok(v) = u16::try_from(v) {
588        output.write_byte(UINT_16)?;
589        output.write(&v.to_be_bytes())?;
590    }
591    else {
592        output.write_byte(UINT_32)?;
593        output.write(&v.to_be_bytes())?;
594    }
595    Ok(())
596}
597
598#[inline]
599fn write_str<W: SerWrite>(output: &mut W, v: &str) -> Result<(), W::Error> {
600    let size = v.len();
601    write_str_len(output, size)?;
602    Ok(output.write_str(v)?)
603}
604
605#[inline]
606fn write_str_len<W: SerWrite>(output: &mut W, len: usize) -> Result<(), W::Error> {
607    if len <= MAX_FIXSTR_SIZE {
608        output.write_byte(FIXSTR | (len as u8))?;
609    }
610    else if let Ok(len) = u8::try_from(len) {
611        output.write_byte(STR_8)?;
612        output.write_byte(len)?;
613    }
614    else if let Ok(len) = u16::try_from(len) {
615        output.write_byte(STR_16)?;
616        output.write(&len.to_be_bytes())?;
617    }
618    else if let Ok(len) = u32::try_from(len) {
619        output.write_byte(STR_32)?;
620        output.write(&len.to_be_bytes())?;
621    }
622    else {
623        return Err(Error::StrLength)
624    }
625    Ok(())
626}
627
628#[inline]
629fn write_array_len<W: SerWrite>(output: &mut W, len: usize) -> Result<(), W::Error> {
630    if len <= MAX_FIXARRAY_SIZE {
631        output.write_byte(FIXARRAY | (len as u8))?;
632    }
633    else if let Ok(len) = u16::try_from(len) {
634        output.write_byte(ARRAY_16)?;
635        output.write(&len.to_be_bytes())?;
636    }
637    else if let Ok(len) = u32::try_from(len) {
638        output.write_byte(ARRAY_32)?;
639        output.write(&len.to_be_bytes())?;
640    }
641    else {
642        return Err(Error::SeqLength)
643    }
644    Ok(())
645}
646
647#[inline]
648fn write_map_len<W: SerWrite>(output: &mut W, len: usize) -> Result<(), W::Error> {
649    if len <= MAX_FIXMAP_SIZE {
650        output.write_byte(FIXMAP | (len as u8))?;
651    }
652    else if let Ok(len) = u16::try_from(len) {
653        output.write_byte(MAP_16)?;
654        output.write(&len.to_be_bytes())?;
655    }
656    else if let Ok(len) = u32::try_from(len) {
657        output.write_byte(MAP_32)?;
658        output.write(&len.to_be_bytes())?;
659    }
660    else {
661        return Err(Error::MapLength)
662    }
663    Ok(())
664}
665
666#[cfg(not(any(feature = "std", feature = "alloc")))]
667struct StringLenCounter(usize);
668
669#[cfg(not(any(feature = "std", feature = "alloc")))]
670struct StringCollector<'a, W> {
671    len: usize,
672    output: &'a mut W,
673}
674
675#[cfg(not(any(feature = "std", feature = "alloc")))]
676impl<'a, W> StringCollector<'a, W> {
677    #[inline(always)]
678    fn new(len: usize, output: &'a mut W) -> Self {
679        Self { len, output }
680    }
681}
682
683#[cfg(not(any(feature = "std", feature = "alloc")))]
684impl fmt::Write for StringLenCounter {
685    fn write_str(&mut self, s: &str) -> fmt::Result {
686        self.0 = self.0.checked_add(s.len()).ok_or(fmt::Error)?;
687        Ok(())
688    }
689}
690
691#[cfg(not(any(feature = "std", feature = "alloc")))]
692impl<'a, W: SerWrite> fmt::Write for StringCollector<'a, W> {
693    fn write_str(&mut self, s: &str) -> fmt::Result {
694        self.len = self.len.checked_sub(s.len()).ok_or(fmt::Error)?;
695        self.output.write_str(s).map_err(|_| fmt::Error)
696    }
697}
698
699pub struct SerializeSeqMap<'a, S> {
700    ser: &'a mut S,
701    len: usize
702}
703
704pub struct SerializeStructArray<'a, S> {
705    ser: &'a mut S,
706    len: usize
707}
708
709pub struct SerializeStructIntMap<'a, S> {
710    ser: &'a mut S,
711    len: usize,
712    idx: u32,
713}
714
715pub struct SerializeStructStrMap<'a, S> {
716    ser: &'a mut S,
717    len: usize
718}
719
720// This impl is SerializeSeq so these methods are called after `serialize_seq`
721// is called on the Serializer.
722impl<'a, S, E> ser::SerializeSeq for SerializeSeqMap<'a, S>
723    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
724          E: fmt::Display + fmt::Debug
725{
726    type Ok = ();
727    type Error = Error<E>;
728
729    fn serialize_element<T>(&mut self, value: &T) -> Result<(), E>
730        where T: ?Sized + Serialize
731    {
732        self.len = self.len.checked_sub(1).ok_or(Error::SeqLength)?;
733        value.serialize(&mut *self.ser)
734    }
735
736    fn end(self) -> Result<(), E> {
737        (self.len == 0).then_some(()).ok_or(Error::SeqLength)
738    }
739}
740
741impl<'a, S, E> ser::SerializeTuple for SerializeSeqMap<'a, S>
742    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
743          E: fmt::Display + fmt::Debug
744{
745    type Ok = ();
746    type Error = Error<E>;
747
748    fn serialize_element<T>(&mut self, value: &T) -> Result<(), E>
749    where T: ?Sized + Serialize
750    {
751        self.len = self.len.checked_sub(1).ok_or(Error::SeqLength)?;
752        value.serialize(&mut *self.ser)
753    }
754
755    fn end(self) -> Result<(), E> {
756        (self.len == 0).then_some(()).ok_or(Error::SeqLength)
757    }
758}
759
760impl<'a, S, E> ser::SerializeTupleStruct for SerializeSeqMap<'a, S>
761    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
762          E: fmt::Display + fmt::Debug
763{
764    type Ok = ();
765    type Error = Error<E>;
766
767    fn serialize_field<T>(&mut self, value: &T) -> Result<(), E>
768        where T: ?Sized + Serialize
769    {
770        self.len = self.len.checked_sub(1).ok_or(Error::SeqLength)?;
771        value.serialize(&mut *self.ser)
772    }
773
774    fn end(self) -> Result<(), E> {
775        (self.len == 0).then_some(()).ok_or(Error::SeqLength)
776    }
777}
778
779// Tuple variants are a little different. { NAME: [ ... ]}
780impl<'a, S, E> ser::SerializeTupleVariant for SerializeSeqMap<'a, S>
781    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
782          E: fmt::Display + fmt::Debug
783{
784    type Ok = ();
785    type Error = Error<E>;
786
787    fn serialize_field<T>(&mut self, value: &T) -> Result<(), E>
788    where T: ?Sized + Serialize
789    {
790        self.len = self.len.checked_sub(1).ok_or(Error::SeqLength)?;
791        value.serialize(&mut *self.ser)
792    }
793
794    fn end(self) -> Result<(), E> {
795        (self.len == 0).then_some(()).ok_or(Error::SeqLength)
796    }
797}
798
799impl<'a, S, E> ser::SerializeMap for SerializeSeqMap<'a, S>
800    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
801          E: fmt::Display + fmt::Debug
802{
803    type Ok = ();
804    type Error = Error<E>;
805
806    fn serialize_key<T>(&mut self, key: &T) -> Result<(), E>
807        where T: ?Sized + Serialize
808    {
809        self.len = self.len.checked_sub(1).ok_or(Error::MapLength)?;
810        key.serialize(&mut *self.ser)
811    }
812
813    fn serialize_value<T>(&mut self, value: &T) -> Result<(), E>
814    where T: ?Sized + Serialize
815    {
816        value.serialize(&mut *self.ser)
817    }
818
819    fn end(self) -> Result<(), E> {
820        (self.len == 0).then_some(()).ok_or(Error::MapLength)
821    }
822}
823
824impl<'a, S, E> ser::SerializeStruct for SerializeStructArray<'a, S>
825    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
826          E: fmt::Display + fmt::Debug
827{
828    type Ok = ();
829    type Error = Error<E>;
830
831    fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<(), E>
832        where T: ?Sized + Serialize
833    {
834        self.len = self.len.checked_sub(1).ok_or(Error::SeqLength)?;
835        value.serialize(&mut *self.ser)
836    }
837
838    /// Allow skipping only last fields
839    fn skip_field(&mut self, _key: &'static str) -> Result<(), E> {
840        (self.len == 0).then_some(()).ok_or(Error::FieldSkipped)
841    }
842
843    fn end(self) -> Result<(), E> {
844        (self.len == 0).then_some(()).ok_or(Error::SeqLength)
845    }
846}
847
848impl<'a, S, E> ser::SerializeStructVariant for SerializeStructArray<'a, S>
849    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
850          E: fmt::Display + fmt::Debug
851{
852    type Ok = ();
853    type Error = Error<E>;
854
855    fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<(), E>
856        where T: ?Sized + Serialize
857    {
858        self.len = self.len.checked_sub(1).ok_or(Error::SeqLength)?;
859        value.serialize(&mut *self.ser)
860    }
861
862    /// Allow skipping only last fields
863    fn skip_field(&mut self, _key: &'static str) -> Result<(), E> {
864        (self.len == 0).then_some(()).ok_or(Error::FieldSkipped)
865    }
866
867    fn end(self) -> Result<(), E> {
868        (self.len == 0).then_some(()).ok_or(Error::SeqLength)
869    }
870}
871
872impl<'a, S, E> ser::SerializeStruct for SerializeStructIntMap<'a, S>
873    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
874          E: fmt::Display + fmt::Debug
875{
876    type Ok = ();
877    type Error = Error<E>;
878
879    fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<(), E>
880        where T: ?Sized + Serialize
881    {
882        self.len = self.len.checked_sub(1).ok_or(Error::MapLength)?;
883        let idx = self.idx;
884        self.idx = idx.wrapping_add(1);
885        self.ser.serialize_u32(idx)?;
886        value.serialize(&mut *self.ser)
887    }
888
889    fn skip_field(&mut self, _key: &'static str) -> Result<(), E> {
890        self.idx = self.idx.wrapping_add(1);
891        Ok(())
892    }
893
894    fn end(self) -> Result<(), E> {
895        (self.len == 0).then_some(()).ok_or(Error::MapLength)
896    }
897}
898
899impl<'a, S, E> ser::SerializeStructVariant for SerializeStructIntMap<'a, S>
900    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
901          E: fmt::Display + fmt::Debug
902{
903    type Ok = ();
904    type Error = Error<E>;
905
906    fn serialize_field<T>(&mut self, _key: &'static str, value: &T) -> Result<(), E>
907        where T: ?Sized + Serialize
908    {
909        self.len = self.len.checked_sub(1).ok_or(Error::MapLength)?;
910        let idx = self.idx;
911        self.idx = idx.wrapping_add(1);
912        self.ser.serialize_u32(idx)?;
913        value.serialize(&mut *self.ser)
914    }
915
916    fn skip_field(&mut self, _key: &'static str) -> Result<(), E> {
917        self.idx = self.idx.wrapping_add(1);
918        Ok(())
919    }
920
921    fn end(self) -> Result<(), E> {
922        (self.len == 0).then_some(()).ok_or(Error::MapLength)
923    }
924}
925
926impl<'a, S, E> ser::SerializeStruct for SerializeStructStrMap<'a, S>
927    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
928          E: fmt::Display + fmt::Debug
929{
930    type Ok = ();
931    type Error = Error<E>;
932
933    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), E>
934        where T: ?Sized + Serialize
935    {
936        self.len = self.len.checked_sub(1).ok_or(Error::MapLength)?;
937        self.ser.serialize_str(key)?;
938        value.serialize(&mut *self.ser)
939    }
940
941    fn end(self) -> Result<(), E> {
942        (self.len == 0).then_some(()).ok_or(Error::MapLength)
943    }
944}
945
946impl<'a, S, E> ser::SerializeStructVariant for SerializeStructStrMap<'a, S>
947    where for<'b> &'b mut S: serde::Serializer<Ok = (), Error = Error<E>>,
948          E: fmt::Display + fmt::Debug
949{
950    type Ok = ();
951    type Error = Error<E>;
952
953    fn serialize_field<T>(&mut self, key: &'static str, value: &T) -> Result<(), E>
954        where T: ?Sized + Serialize
955    {
956        self.len = self.len.checked_sub(1).ok_or(Error::MapLength)?;
957        self.ser.serialize_str(key)?;
958        value.serialize(&mut *self.ser)
959    }
960
961    fn end(self) -> Result<(), E> {
962        (self.len == 0).then_some(()).ok_or(Error::MapLength)
963    }
964}
965
966#[cfg(test)]
967mod tests {
968    #[cfg(feature = "std")]
969    use std::{vec, vec::Vec, collections::BTreeMap, format};
970    #[cfg(all(feature = "alloc",not(feature = "std")))]
971    use alloc::{vec, vec::Vec, collections::BTreeMap, format};
972    use super::*;
973    use ser_write::{SliceWriter, SerError};
974
975    fn to_slice_compact<'a, T>(buf: &'a mut[u8], value: &T) -> Result<&'a[u8], SerError>
976        where T: Serialize + ?Sized
977    {
978        let mut writer = SliceWriter::new(buf);
979        to_writer_compact(&mut writer, value)?;
980        Ok(writer.split().0)
981    }
982
983    fn to_slice<'a, T>(buf: &'a mut[u8], value: &T) -> Result<&'a[u8], SerError>
984        where T: Serialize + ?Sized
985    {
986        let mut writer = SliceWriter::new(buf);
987        to_writer(&mut writer, value)?;
988        Ok(writer.split().0)
989    }
990
991    fn to_slice_named<'a, T>(buf: &'a mut[u8], value: &T) -> Result<&'a[u8], SerError>
992        where T: Serialize + ?Sized
993    {
994        let mut writer = SliceWriter::new(buf);
995        to_writer_named(&mut writer, value)?;
996        Ok(writer.split().0)
997    }
998
999    #[test]
1000    fn test_msgpack_serializer() {
1001        macro_rules! test_serializer {
1002            ($ser:ty) => {
1003                let mut buf = [0u8;2];
1004                let writer = SliceWriter::new(&mut buf);
1005                let mut ser = <$ser>::new(writer);
1006                assert_eq!(ser::Serializer::is_human_readable(&(&mut ser)), false);
1007                assert_eq!(ser.writer().write_byte(0), Ok(()));
1008                let mut writer: SliceWriter = ser.into_inner();
1009                assert_eq!(writer.write_byte(1), Ok(()));
1010                assert_eq!(buf, [0, 1]);
1011            };
1012        }
1013        test_serializer!(CompactSerializer<SliceWriter>);
1014        test_serializer!(StructMapStrSerializer<SliceWriter>);
1015        test_serializer!(StructMapIdxSerializer<SliceWriter>);
1016    }
1017
1018    #[test]
1019    fn test_msgpack() {
1020        #[derive(Serialize)]
1021        enum Flavors {
1022            Vanilla,
1023            Chocolate,
1024            Strawberry
1025        }
1026        #[derive(Serialize)]
1027        enum Prices<'a> {
1028            Vanilla(f32),
1029            Chocolate(&'a str),
1030            Strawberry { gold: u8, silver: u16 }
1031        }
1032        #[derive(Serialize)]
1033        struct Unit;
1034        #[derive(Serialize)]
1035        struct Test {
1036            compact: bool,
1037            schema: u32,
1038            unit: Unit
1039        }
1040
1041        let test = Test {
1042            compact: true,
1043            schema: 0,
1044            unit: Unit
1045        };
1046        let mut buf = [0u8;80];
1047
1048        let expected = b"\x83\xA7compact\xC3\xA6schema\x00\xA4unit\xC0";
1049        assert_eq!(to_slice_named(&mut buf, &test).unwrap(), expected);
1050        let expected = b"\x83\x00\xC3\x01\x00\x02\xC0";
1051        assert_eq!(to_slice(&mut buf, &test).unwrap(), expected);
1052        let expected = b"\x93\xC3\x00\xC0";
1053        assert_eq!(to_slice_compact(&mut buf, &test).unwrap(), expected);
1054
1055        let test = [Flavors::Strawberry, Flavors::Vanilla, Flavors::Chocolate];
1056        let expected = b"\x93\xAAStrawberry\xA7Vanilla\xA9Chocolate";
1057        assert_eq!(to_slice_named(&mut buf, &test).unwrap(), expected);
1058        let expected = b"\x93\x02\x00\x01";
1059        assert_eq!(to_slice(&mut buf, &test).unwrap(), expected);
1060        assert_eq!(to_slice_compact(&mut buf, &test).unwrap(), expected);
1061
1062        let test = (Prices::Strawberry { gold: 7, silver: 1000 },
1063                    Prices::Vanilla(12.5),
1064                    Prices::Chocolate("free"));
1065        let expected = b"\x93\x81\xAAStrawberry\x82\xA4gold\x07\xA6silver\xCD\x03\xE8\x81\xA7Vanilla\xCA\x41\x48\x00\x00\x81\xA9Chocolate\xA4free";
1066        assert_eq!(to_slice_named(&mut buf, &test).unwrap(), expected);
1067        let expected = b"\x93\x81\x02\x82\x00\x07\x01\xCD\x03\xE8\x81\x00\xCA\x41\x48\x00\x00\x81\x01\xA4free";
1068        assert_eq!(to_slice(&mut buf, &test).unwrap(), expected);
1069        let expected = b"\x93\x81\x02\x92\x07\xCD\x03\xE8\x81\x00\xCA\x41\x48\x00\x00\x81\x01\xA4free";
1070        assert_eq!(to_slice_compact(&mut buf, &test).unwrap(), expected);
1071    }
1072
1073    #[test]
1074    fn test_msgpack_ints() {
1075        let mut buf = [0u8;9];
1076        macro_rules! test_msgpack_fixint {
1077            ($ty:ty) => {
1078                let int: $ty = 0;
1079                let expected = b"\x00";
1080                assert_eq!(to_slice(&mut buf, &int).unwrap(), expected);
1081                assert_eq!(to_slice_named(&mut buf, &int).unwrap(), expected);
1082                assert_eq!(to_slice_compact(&mut buf, &int).unwrap(), expected);
1083                let int: $ty = 127;
1084                let expected = b"\x7f";
1085                assert_eq!(to_slice(&mut buf, &int).unwrap(), expected);
1086                assert_eq!(to_slice_named(&mut buf, &int).unwrap(), expected);
1087                assert_eq!(to_slice_compact(&mut buf, &int).unwrap(), expected);
1088                assert_eq!(to_slice_compact(&mut buf[..0], &int), Err(Error::Writer(SerError::BufferFull)));
1089                assert_eq!(to_slice(&mut buf[..0], &int), Err(Error::Writer(SerError::BufferFull)));
1090                assert_eq!(to_slice_named(&mut buf[..0], &int), Err(Error::Writer(SerError::BufferFull)));
1091            };
1092            (- $ty:ty) => {
1093                let int: $ty = -1;
1094                let expected = b"\xff";
1095                assert_eq!(to_slice(&mut buf, &int).unwrap(), expected);
1096                assert_eq!(to_slice_named(&mut buf, &int).unwrap(), expected);
1097                assert_eq!(to_slice_compact(&mut buf, &int).unwrap(), expected);
1098                let int: $ty = -32;
1099                let expected = b"\xe0";
1100                assert_eq!(to_slice(&mut buf, &int).unwrap(), expected);
1101                assert_eq!(to_slice_named(&mut buf, &int).unwrap(), expected);
1102                assert_eq!(to_slice_compact(&mut buf, &int).unwrap(), expected);
1103            };
1104        }
1105        macro_rules! test_msgpack_int {
1106            ($ty:ty, $(($val:expr)=$exp:literal),*) => {$(
1107                let int: $ty = $val;
1108                let expected = $exp;
1109                assert_eq!(to_slice(&mut buf, &int).unwrap(), expected);
1110                assert_eq!(to_slice_named(&mut buf, &int).unwrap(), expected);
1111                assert_eq!(to_slice_compact(&mut buf, &int).unwrap(), expected);
1112                for len in 0..expected.len() {
1113                    assert_eq!(to_slice_compact(&mut buf[..len], &int), Err(Error::Writer(SerError::BufferFull)));
1114                    assert_eq!(to_slice(&mut buf[..len], &int), Err(Error::Writer(SerError::BufferFull)));
1115                    assert_eq!(to_slice_named(&mut buf[..len], &int), Err(Error::Writer(SerError::BufferFull)));
1116                }
1117            )*};
1118        }
1119        test_msgpack_fixint!(u8);
1120        test_msgpack_fixint!(i8);
1121        test_msgpack_fixint!(- i8);
1122        test_msgpack_fixint!(u16);
1123        test_msgpack_fixint!(i16);
1124        test_msgpack_fixint!(- i16);
1125        test_msgpack_fixint!(u32);
1126        test_msgpack_fixint!(i32);
1127        test_msgpack_fixint!(- i32);
1128        test_msgpack_fixint!(u64);
1129        test_msgpack_fixint!(i64);
1130        test_msgpack_fixint!(- i64);
1131
1132        test_msgpack_int!(i8, (-33)=b"\xD0\xdf", (-128)=b"\xD0\x80");
1133        test_msgpack_int!(u8, (128)=b"\xCC\x80", ( 255)=b"\xCC\xff");
1134        test_msgpack_int!(i16, 
1135            (-33)=b"\xD0\xdf", (-128)=b"\xD0\x80",
1136            (128)=b"\xCC\x80", ( 255)=b"\xCC\xff",
1137            (256)=b"\xD1\x01\x00",
1138            (i16::MAX)=b"\xD1\x7f\xff",
1139            (i16::MIN)=b"\xD1\x80\x00");
1140        test_msgpack_int!(u16, 
1141            (128)=b"\xCC\x80", ( 255)=b"\xCC\xff",
1142            (256)=b"\xCD\x01\x00",
1143            (u16::MAX)=b"\xCD\xff\xff");
1144        test_msgpack_int!(i32,
1145            (-33)=b"\xD0\xdf", (-128)=b"\xD0\x80",
1146            (128)=b"\xCC\x80", ( 255)=b"\xCC\xff",
1147            (256)=b"\xD1\x01\x00",
1148            (i16::MAX.into())=b"\xD1\x7f\xff",
1149            (i16::MIN.into())=b"\xD1\x80\x00",
1150            (u16::MAX.into())=b"\xCD\xff\xff",
1151            (i32::MAX.into())=b"\xD2\x7f\xff\xff\xff",
1152            (i32::MIN.into())=b"\xD2\x80\x00\x00\x00");
1153        test_msgpack_int!(u32, 
1154            (128)=b"\xCC\x80", ( 255)=b"\xCC\xff",
1155            (256)=b"\xCD\x01\x00",
1156            (u16::MAX.into())=b"\xCD\xff\xff",
1157            (u32::MAX)=b"\xCE\xff\xff\xff\xff");
1158        test_msgpack_int!(i64,
1159            (-33)=b"\xD0\xdf", (-128)=b"\xD0\x80",
1160            (128)=b"\xCC\x80", ( 255)=b"\xCC\xff",
1161            (256)=b"\xD1\x01\x00",
1162            (i16::MAX.into())=b"\xD1\x7f\xff",
1163            (i16::MIN.into())=b"\xD1\x80\x00",
1164            (u16::MAX.into())=b"\xCD\xff\xff",
1165            (i32::MAX.into())=b"\xD2\x7f\xff\xff\xff",
1166            (i32::MIN.into())=b"\xD2\x80\x00\x00\x00",
1167            (u32::MAX.into())=b"\xCE\xff\xff\xff\xff",
1168            (i64::MAX.into())=b"\xD3\x7f\xff\xff\xff\xff\xff\xff\xff",
1169            (i64::MIN.into())=b"\xD3\x80\x00\x00\x00\x00\x00\x00\x00");
1170        test_msgpack_int!(u64, 
1171            (128)=b"\xCC\x80", ( 255)=b"\xCC\xff",
1172            (256)=b"\xCD\x01\x00",
1173            (u16::MAX.into())=b"\xCD\xff\xff",
1174            (u32::MAX.into())=b"\xCE\xff\xff\xff\xff",
1175            (u64::MAX)=b"\xCF\xff\xff\xff\xff\xff\xff\xff\xff");
1176    }
1177
1178    #[test]
1179    fn test_msgpack_floats() {
1180        let mut buf = [0u8;9];
1181        let flt = 0.0f32;
1182        let expected = b"\xCA\x00\x00\x00\x00";
1183        assert_eq!(to_slice(&mut buf, &flt).unwrap(), expected);
1184        assert_eq!(to_slice_named(&mut buf, &flt).unwrap(), expected);
1185        assert_eq!(to_slice_compact(&mut buf, &flt).unwrap(), expected);
1186        for len in 0..expected.len() {
1187            assert_eq!(to_slice_compact(&mut buf[..len], &flt), Err(Error::Writer(SerError::BufferFull)));
1188            assert_eq!(to_slice(&mut buf[..len], &flt), Err(Error::Writer(SerError::BufferFull)));
1189            assert_eq!(to_slice_named(&mut buf[..len], &flt), Err(Error::Writer(SerError::BufferFull)));
1190        }
1191        let flt = 0.0f64;
1192        let expected = b"\xCB\x00\x00\x00\x00\x00\x00\x00\x00";
1193        assert_eq!(to_slice(&mut buf, &flt).unwrap(), expected);
1194        assert_eq!(to_slice_named(&mut buf, &flt).unwrap(), expected);
1195        assert_eq!(to_slice_compact(&mut buf, &flt).unwrap(), expected);
1196        for len in 0..expected.len() {
1197            assert_eq!(to_slice_compact(&mut buf[..len], &flt), Err(Error::Writer(SerError::BufferFull)));
1198            assert_eq!(to_slice(&mut buf[..len], &flt), Err(Error::Writer(SerError::BufferFull)));
1199            assert_eq!(to_slice_named(&mut buf[..len], &flt), Err(Error::Writer(SerError::BufferFull)));
1200        }
1201    }
1202
1203    #[cfg(any(feature = "std", feature = "alloc"))]
1204    #[test]
1205    fn test_msgpack_bytes_owned() {
1206        #[derive(Serialize)]
1207        struct Test {
1208            #[serde(with = "serde_bytes")]
1209            key: Vec<u8>
1210        }
1211        // BIN-16
1212        let vec = vec![169u8;65535];
1213        let value = [Test { key: vec }];
1214        let res = to_vec_named(&value).unwrap();
1215        assert_eq!(res.len(), 9+65535);
1216        assert!(res.starts_with(b"\x91\x81\xA3key\xC5\xff\xff"));
1217        for i in 0..65535 {
1218            assert_eq!(res[i+9], 169);
1219        }
1220        let res = to_vec(&value).unwrap();
1221        assert_eq!(res.len(), 6+65535);
1222        assert!(res.starts_with(b"\x91\x81\x00\xC5\xff\xff"));
1223        for i in 0..65535 {
1224            assert_eq!(res[i+6], 169);
1225        }
1226        let res = to_vec_compact(&value).unwrap();
1227        assert_eq!(res.len(), 5+65535);
1228        assert!(res.starts_with(b"\x91\x91\xC5\xff\xff"));
1229        for i in 0..65535 {
1230            assert_eq!(res[i+5], 169);
1231        }
1232        let mut buf = [0u8;15];
1233        // errors
1234        for len in 0..buf.len() {
1235            assert_eq!(to_slice_compact(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1236            assert_eq!(to_slice(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1237            assert_eq!(to_slice_named(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1238        }
1239        // BIN-32
1240        let vec = vec![77u8;65536];
1241        let value = [Test { key: vec }];
1242        let res = to_vec_named(&value).unwrap();
1243        assert_eq!(res.len(), 11+65536);
1244        assert!(res.starts_with(b"\x91\x81\xA3key\xC6\x00\x01\x00\x00"));
1245        for i in 0..65536 {
1246            assert_eq!(res[i+11], 77);
1247        }
1248        let res = to_vec(&value).unwrap();
1249        assert_eq!(res.len(), 8+65536);
1250        assert!(res.starts_with(b"\x91\x81\x00\xC6\x00\x01\x00\x00"));
1251        for i in 0..65536 {
1252            assert_eq!(res[i+8], 77);
1253        }
1254        let res = to_vec_compact(&value).unwrap();
1255        assert_eq!(res.len(), 7+65536);
1256        assert!(res.starts_with(b"\x91\x91\xC6\x00\x01\x00\x00"));
1257        for i in 0..65536 {
1258            assert_eq!(res[i+7], 77);
1259        }
1260        // errors
1261        for len in 0..buf.len() {
1262            assert_eq!(to_slice_compact(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1263            assert_eq!(to_slice(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1264            assert_eq!(to_slice_named(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1265        }
1266    }
1267
1268    #[test]
1269    fn test_msgpack_bytes() {
1270        #[derive(Serialize)]
1271        struct Test<'a> {
1272            #[serde(with = "serde_bytes")]
1273            key: &'a[u8]
1274        }
1275        let mut buf = [0u8;17];
1276        let value = [Test { key: b"\xc1\x00\x00bytes\xff" }];
1277        assert_eq!(to_slice_compact(&mut buf, &value).unwrap(),
1278            b"\x91\x91\xC4\x09\xc1\x00\x00bytes\xff");
1279        assert_eq!(to_slice(&mut buf, &value).unwrap(),
1280            b"\x91\x81\x00\xC4\x09\xc1\x00\x00bytes\xff");
1281        assert_eq!(to_slice_named(&mut buf, &value).unwrap(),
1282            b"\x91\x81\xA3key\xC4\x09\xc1\x00\x00bytes\xff");
1283        for len in 0..13 {
1284            assert_eq!(to_slice_compact(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1285        }
1286        for len in 0..14 {
1287            assert_eq!(to_slice(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1288        }
1289        for len in 0..buf.len() {
1290            assert_eq!(to_slice_named(&mut buf[..len], &value), Err(Error::Writer(SerError::BufferFull)));
1291        }
1292    }
1293
1294    #[cfg(any(feature = "std", feature = "alloc"))]
1295    #[test]
1296    fn test_msgpack_map() {
1297        let test_map = |amap, header: &[u8]| {
1298            let mut buf = [0u8,20];
1299            let res = to_vec(&amap).unwrap();
1300            assert_eq!(&res[0..header.len()], header);
1301            let (b, len): (BTreeMap::<u32,bool>, _) = crate::from_slice(&res).unwrap();
1302            assert_eq!(len, res.len());
1303            assert_eq!(amap, b);
1304            assert_eq!(to_vec_compact(&amap).unwrap(), res);
1305            assert_eq!(to_vec_named(&amap).unwrap(), res);
1306            // errors
1307            for len in 0..buf.len() {
1308                assert_eq!(to_slice_compact(&mut buf[..len], &amap), Err(Error::Writer(SerError::BufferFull)));
1309                assert_eq!(to_slice(&mut buf[..len], &amap), Err(Error::Writer(SerError::BufferFull)));
1310                assert_eq!(to_slice_named(&mut buf[..len], &amap), Err(Error::Writer(SerError::BufferFull)));
1311            }
1312        };
1313        // MAP-32
1314        let mut a = BTreeMap::<u32,bool>::new();
1315        for k in 0..65536 {
1316            a.insert(k, true);
1317        }
1318        let expected = &[0xDF, 0x00, 0x01, 0x00, 0x00];
1319        test_map(a, expected);
1320        // MAP-16
1321        let mut a = BTreeMap::<u32,bool>::new();
1322        for k in 0..256 {
1323            a.insert(k, true);
1324        }
1325        let expected = &[0xDE, 0x01, 0x00];
1326        test_map(a, expected);
1327    }
1328
1329    #[test]
1330    fn test_msgpack_map_err() {
1331        struct PhonyMap<'a>(&'a[(i32,bool)]);
1332        // forbidden unknown length maps
1333        impl<'a> serde::Serialize for PhonyMap<'a>{
1334            fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
1335                where S: serde::Serializer
1336            {
1337                serializer.serialize_map(None)?;
1338                unreachable!();
1339            }
1340        }
1341        let a = PhonyMap(&[(1,true)]);
1342        assert_eq!(a.0, [(1,true)]);
1343        let mut buf = [0u8,10];
1344        assert_eq!(to_slice_compact(&mut buf, &a), Err(Error::MapLength));
1345        assert_eq!(to_slice(&mut buf, &a), Err(Error::MapLength));
1346        assert_eq!(to_slice_named(&mut buf, &a), Err(Error::MapLength));
1347    }
1348
1349    #[cfg(any(feature = "std", feature = "alloc"))]
1350    #[test]
1351    fn test_msgpack_array() {
1352        let mut a = Vec::<i32>::new();
1353        for _ in 0..65536 {
1354            a.push(-1i32);
1355        }
1356        let mut expected = vec![0xDD, 0x00, 0x01, 0x00, 0x00];
1357        for _ in 0..65536 {
1358            expected.push(0xff);
1359        }
1360        assert_eq!(to_vec(&a).unwrap(), expected);
1361        assert_eq!(to_vec_compact(&a).unwrap(), expected);
1362        assert_eq!(to_vec_named(&a).unwrap(), expected);
1363        let mut buf = [0u8;10];
1364        // errors
1365        for len in 0..buf.len() {
1366            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1367            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1368            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1369        }
1370    }
1371
1372    #[cfg(any(feature = "std", feature = "alloc"))]
1373    #[test]
1374    fn test_msgpack_str() {
1375        // STR-16
1376        let mut buf = [0u8;10];
1377        let s = include_str!("../LICENSE-MIT");
1378        let mut expected = vec![0xDA];
1379        expected.extend_from_slice(&u16::try_from(s.len()).unwrap().to_be_bytes());
1380        expected.extend_from_slice(s.as_bytes());
1381        assert_eq!(to_vec(s).unwrap(), expected);
1382        assert_eq!(to_vec_compact(s).unwrap(), expected);
1383        assert_eq!(to_vec_named(s).unwrap(), expected);
1384        // errors
1385        for len in 0..buf.len() {
1386            assert_eq!(to_slice_compact(&mut buf[..len], s), Err(Error::Writer(SerError::BufferFull)));
1387            assert_eq!(to_slice(&mut buf[..len], s), Err(Error::Writer(SerError::BufferFull)));
1388            assert_eq!(to_slice_named(&mut buf[..len], s), Err(Error::Writer(SerError::BufferFull)));
1389        }
1390        // STR-32
1391        let mut s = String::new();
1392        for _ in 0..256u16 {
1393            for i in 0..=255u8 {
1394                s.push(i.into());
1395            }
1396        }
1397        let mut expected = vec![0xDB];
1398        expected.extend_from_slice(&u32::try_from(s.len()).unwrap().to_be_bytes());
1399        expected.extend_from_slice(s.as_bytes());
1400        assert_eq!(to_vec(&s).unwrap(), expected);
1401        assert_eq!(to_vec_compact(&s).unwrap(), expected);
1402        assert_eq!(to_vec_named(&s).unwrap(), expected);
1403        // errors
1404        for len in 0..buf.len() {
1405            assert_eq!(to_slice_compact(&mut buf[..len], &s), Err(Error::Writer(SerError::BufferFull)));
1406            assert_eq!(to_slice(&mut buf[..len], &s), Err(Error::Writer(SerError::BufferFull)));
1407            assert_eq!(to_slice_named(&mut buf[..len], &s), Err(Error::Writer(SerError::BufferFull)));
1408        }
1409    }
1410
1411    #[test]
1412    fn test_ser_bool() {
1413        let mut buf = [0u8;1];
1414        assert_eq!(to_slice(&mut buf, &true).unwrap(), b"\xC3");
1415        assert_eq!(to_slice_compact(&mut buf, &true).unwrap(), b"\xC3");
1416        assert_eq!(to_slice_named(&mut buf, &true).unwrap(), b"\xC3");
1417        assert_eq!(to_slice(&mut buf, &false).unwrap(), b"\xC2");
1418        assert_eq!(to_slice_compact(&mut buf, &false).unwrap(), b"\xC2");
1419        assert_eq!(to_slice_named(&mut buf, &false).unwrap(), b"\xC2");
1420    }
1421
1422    #[test]
1423    fn test_ser_str() {
1424        let mut buf = [0u8;256];
1425        assert_eq!(to_slice(&mut buf, "hello").unwrap(), b"\xA5hello");
1426        assert_eq!(to_slice_compact(&mut buf, "hello").unwrap(), b"\xA5hello");
1427        assert_eq!(to_slice_named(&mut buf, "hello").unwrap(), b"\xA5hello");
1428        assert_eq!(to_slice(&mut buf, "").unwrap(), b"\xA0");
1429        assert_eq!(to_slice_compact(&mut buf, "").unwrap(), b"\xA0");
1430        assert_eq!(to_slice_named(&mut buf, "").unwrap(), b"\xA0");
1431
1432        assert_eq!(to_slice(&mut buf, "ä").unwrap(), b"\xA2\xC3\xA4");
1433        assert_eq!(to_slice_compact(&mut buf, "ä").unwrap(), b"\xA2\xC3\xA4");
1434        assert_eq!(to_slice_named(&mut buf, "ä").unwrap(), b"\xA2\xC3\xA4");
1435        assert_eq!(to_slice(&mut buf, "৬").unwrap(), b"\xA3\xe0\xa7\xac");
1436        assert_eq!(to_slice_compact(&mut buf, "৬").unwrap(), b"\xA3\xe0\xa7\xac");
1437        assert_eq!(to_slice_named(&mut buf, "৬").unwrap(), b"\xA3\xe0\xa7\xac");
1438        assert_eq!(to_slice(&mut buf, "\u{A0}").unwrap(), b"\xA2\xC2\xA0"); // non-breaking space
1439        assert_eq!(to_slice_compact(&mut buf, "\u{A0}").unwrap(), b"\xA2\xC2\xA0"); // non-breaking space
1440        assert_eq!(to_slice_named(&mut buf, "\u{A0}").unwrap(), b"\xA2\xC2\xA0"); // non-breaking space
1441        assert_eq!(to_slice(&mut buf, "ℝ").unwrap(), b"\xA3\xe2\x84\x9d"); // 3 byte character
1442        assert_eq!(to_slice(&mut buf, "💣").unwrap(), b"\xA4\xf0\x9f\x92\xa3"); // 4 byte character
1443        assert_eq!(to_slice_compact(&mut buf, "💣").unwrap(), b"\xA4\xf0\x9f\x92\xa3"); // 4 byte character
1444        assert_eq!(to_slice_named(&mut buf, "💣").unwrap(), b"\xA4\xf0\x9f\x92\xa3"); // 4 byte character
1445        assert_eq!(to_slice(&mut buf, &'ä').unwrap(), b"\xA2\xC3\xA4");
1446        assert_eq!(to_slice_compact(&mut buf, &'ä').unwrap(), b"\xA2\xC3\xA4");
1447        assert_eq!(to_slice_named(&mut buf, &'ä').unwrap(), b"\xA2\xC3\xA4");
1448        assert_eq!(to_slice(&mut buf, &'৬').unwrap(), b"\xA3\xe0\xa7\xac");
1449        assert_eq!(to_slice_compact(&mut buf, &'৬').unwrap(), b"\xA3\xe0\xa7\xac");
1450        assert_eq!(to_slice_named(&mut buf, &'৬').unwrap(), b"\xA3\xe0\xa7\xac");
1451        assert_eq!(to_slice(&mut buf, &'\u{A0}').unwrap(), b"\xA2\xC2\xA0"); // non-breaking space
1452        assert_eq!(to_slice_compact(&mut buf, &'\u{A0}').unwrap(), b"\xA2\xC2\xA0"); // non-breaking space
1453        assert_eq!(to_slice_named(&mut buf, &'\u{A0}').unwrap(), b"\xA2\xC2\xA0"); // non-breaking space
1454        assert_eq!(to_slice(&mut buf, &'ℝ').unwrap(), b"\xA3\xe2\x84\x9d"); // 3 byte character
1455        assert_eq!(to_slice(&mut buf, &'💣').unwrap(), b"\xA4\xf0\x9f\x92\xa3"); // 4 byte character
1456        assert_eq!(to_slice_compact(&mut buf, &'💣').unwrap(), b"\xA4\xf0\x9f\x92\xa3"); // 4 byte character
1457        assert_eq!(to_slice_named(&mut buf, &'💣').unwrap(), b"\xA4\xf0\x9f\x92\xa3"); // 4 byte character
1458        assert_eq!(to_slice(&mut buf, "\r").unwrap(), b"\xA1\r");
1459        assert_eq!(to_slice(&mut buf, &'\r').unwrap(), b"\xA1\r");
1460        assert_eq!(to_slice_compact(&mut buf, "\x00\t\r\n").unwrap(), b"\xA4\x00\t\r\n");
1461        assert_eq!(to_slice_named(&mut buf, "\x00\t\r\n").unwrap(), b"\xA4\x00\t\r\n");
1462
1463        struct SimpleDecimal(f32);
1464        impl fmt::Display for SimpleDecimal {
1465            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1466                write!(f, "{:.2}", &self.0)
1467            }
1468        }
1469        impl serde::Serialize for SimpleDecimal {
1470            fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
1471                where S: serde::Serializer
1472            {
1473                serializer.collect_str(self)
1474            }
1475        }
1476        let a = SimpleDecimal(core::f32::consts::PI);
1477        assert_eq!(to_slice(&mut buf, &a).unwrap(), b"\xA43.14");
1478        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), b"\xA43.14");
1479        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), b"\xA43.14");
1480
1481        let s = "Γαζίες καὶ μυρτιὲς δὲν θὰ βρῶ πιὰ στὸ χρυσαφὶ ξέφωτο";
1482        let expected = b"\xD9\x67\xce\x93\xce\xb1\xce\xb6\xce\xaf\xce\xb5\xcf\x82\x20\xce\xba\xce\xb1\xe1\xbd\xb6\x20\xce\xbc\xcf\x85\xcf\x81\xcf\x84\xce\xb9\xe1\xbd\xb2\xcf\x82\x20\xce\xb4\xe1\xbd\xb2\xce\xbd\x20\xce\xb8\xe1\xbd\xb0\x20\xce\xb2\xcf\x81\xe1\xbf\xb6\x20\xcf\x80\xce\xb9\xe1\xbd\xb0\x20\xcf\x83\xcf\x84\xe1\xbd\xb8\x20\xcf\x87\xcf\x81\xcf\x85\xcf\x83\xce\xb1\xcf\x86\xe1\xbd\xb6\x20\xce\xbe\xce\xad\xcf\x86\xcf\x89\xcf\x84\xce\xbf";
1483        assert_eq!(to_slice(&mut buf, s).unwrap(), expected);
1484        assert_eq!(to_slice_compact(&mut buf, s).unwrap(), expected);
1485        assert_eq!(to_slice_named(&mut buf, s).unwrap(), expected);
1486        // errors
1487        for len in 0..5 {
1488            assert!(to_slice_compact(&mut buf[..len], &a).is_err());
1489            assert!(to_slice(&mut buf[..len], &a).is_err());
1490            assert!(to_slice_named(&mut buf[..len], &a).is_err());
1491        }
1492        for len in 0..expected.len() {
1493            assert_eq!(to_slice_compact(&mut buf[..len], s), Err(Error::Writer(SerError::BufferFull)));
1494            assert_eq!(to_slice(&mut buf[..len], s), Err(Error::Writer(SerError::BufferFull)));
1495            assert_eq!(to_slice_named(&mut buf[..len], s), Err(Error::Writer(SerError::BufferFull)));
1496        }
1497    }
1498
1499    #[test]
1500    fn test_ser_array() {
1501        let mut buf = [0u8;19];
1502        let empty: [&str;0] = [];
1503        assert_eq!(to_slice(&mut buf, &empty).unwrap(), b"\x90");
1504        assert_eq!(to_slice_compact(&mut buf, &empty).unwrap(), b"\x90");
1505        assert_eq!(to_slice_named(&mut buf, &empty).unwrap(), b"\x90");
1506        assert_eq!(to_slice(&mut buf, &[0, 1, 2]).unwrap(), b"\x93\x00\x01\x02");
1507        assert_eq!(to_slice_compact(&mut buf, &[0, 1, 2]).unwrap(), b"\x93\x00\x01\x02");
1508        assert_eq!(to_slice_named(&mut buf, &[0, 1, 2]).unwrap(), b"\x93\x00\x01\x02");
1509        // FIXARRAY
1510        let a = [-1i8;15];
1511        let expected = b"\x9F\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
1512        assert_eq!(to_slice(&mut buf, &a).unwrap(), expected);
1513        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), expected);
1514        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), expected);
1515        // errors
1516        for len in 0..expected.len() {
1517            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1518            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1519            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1520        }
1521        // ARRAY-16
1522        let a = [-1i32;16];
1523        let expected = b"\xDC\x00\x10\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF";
1524        assert_eq!(to_slice(&mut buf, &a).unwrap(), expected);
1525        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), expected);
1526        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), expected);
1527        // errors
1528        for len in 0..expected.len() {
1529            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1530            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1531            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1532        }
1533        // forbidden unknown length sequences
1534        struct PhonySeq<'a>(&'a[i32]);
1535        impl<'a> serde::Serialize for PhonySeq<'a> {
1536            fn serialize<S>(&self, serializer: S) -> core::result::Result<S::Ok, S::Error>
1537                where S: serde::Serializer
1538            {
1539                serializer.serialize_seq(None)?;
1540                unreachable!();
1541            }
1542        }
1543        let a = PhonySeq(&[1,2,3]);
1544        assert_eq!(a.0, [1,2,3]);
1545        assert_eq!(to_slice_compact(&mut buf, &a), Err(Error::SeqLength));
1546        assert_eq!(to_slice(&mut buf, &a), Err(Error::SeqLength));
1547        assert_eq!(to_slice_named(&mut buf, &a), Err(Error::SeqLength));
1548    }
1549
1550    #[test]
1551    fn test_ser_enum() {
1552        #[derive(Serialize)]
1553        enum Type {
1554            #[serde(rename = "boolean")]
1555            Boolean,
1556            #[serde(rename = "number")]
1557            Number,
1558        }
1559        let mut buf = [0u8;8];
1560
1561        assert_eq!(
1562            to_slice(&mut buf, &Type::Boolean).unwrap(),
1563            b"\x00");
1564        assert_eq!(
1565            to_slice_compact(&mut buf, &Type::Boolean).unwrap(),
1566            b"\x00");
1567        assert_eq!(
1568            to_slice_named(&mut buf, &Type::Boolean).unwrap(),
1569            b"\xA7boolean");
1570
1571        assert_eq!(
1572            to_slice(&mut buf, &Type::Number).unwrap(),
1573            b"\x01");
1574        assert_eq!(
1575            to_slice_compact(&mut buf, &Type::Number).unwrap(),
1576            b"\x01");
1577        assert_eq!(
1578            to_slice_named(&mut buf, &Type::Number).unwrap(),
1579            b"\xA6number");
1580    }
1581
1582    #[test]
1583    fn test_ser_struct_bool() {
1584        #[derive(Serialize)]
1585        struct Led {
1586            led: bool,
1587        }
1588
1589        let mut buf = [0u8;6];
1590
1591        assert_eq!(
1592            to_slice_compact(&mut buf, &Led { led: true }).unwrap(),
1593            b"\x91\xC3");
1594        assert_eq!(
1595            to_slice(&mut buf, &Led { led: true }).unwrap(),
1596            b"\x81\x00\xC3");
1597        assert_eq!(
1598            to_slice_named(&mut buf, &Led { led: true }).unwrap(),
1599            b"\x81\xA3led\xC3");
1600    }
1601
1602    #[test]
1603    fn test_ser_struct_i8() {
1604        #[derive(Serialize)]
1605        struct Temperature {
1606            temperature: i8,
1607        }
1608
1609        let mut buf = [0u8;15];
1610
1611        assert_eq!(
1612            to_slice_compact(&mut buf, &Temperature { temperature: 127 }).unwrap(),
1613            b"\x91\x7f");
1614        assert_eq!(
1615            to_slice(&mut buf, &Temperature { temperature: 127 }).unwrap(),
1616            b"\x81\x00\x7f");
1617        assert_eq!(
1618            to_slice_named(&mut buf, &Temperature { temperature: 127 }).unwrap(),
1619            b"\x81\xABtemperature\x7f");
1620
1621        assert_eq!(
1622            to_slice_compact(&mut buf, &Temperature { temperature: 20 }).unwrap(),
1623            b"\x91\x14");
1624        assert_eq!(
1625            to_slice(&mut buf, &Temperature { temperature: 20 }).unwrap(),
1626            b"\x81\x00\x14");
1627        assert_eq!(
1628            to_slice_named(&mut buf, &Temperature { temperature: 20 }).unwrap(),
1629            b"\x81\xABtemperature\x14");
1630
1631        assert_eq!(
1632            to_slice_compact(&mut buf, &Temperature { temperature: -17 }).unwrap(),
1633            b"\x91\xef");
1634        assert_eq!(
1635            to_slice(&mut buf, &Temperature { temperature: -17 }).unwrap(),
1636            b"\x81\x00\xef");
1637        assert_eq!(
1638            to_slice_named(&mut buf, &Temperature { temperature: -17 }).unwrap(),
1639            b"\x81\xABtemperature\xef");
1640
1641        assert_eq!(
1642            to_slice_compact(&mut buf, &Temperature { temperature: -128 }).unwrap(),
1643            b"\x91\xD0\x80");
1644        assert_eq!(
1645            to_slice(&mut buf, &Temperature { temperature: -128 }).unwrap(),
1646            b"\x81\x00\xD0\x80");
1647        assert_eq!(
1648            to_slice_named(&mut buf, &Temperature { temperature: -128 }).unwrap(),
1649            b"\x81\xABtemperature\xD0\x80");
1650    }
1651
1652    #[test]
1653    fn test_ser_struct_u8() {
1654        #[derive(Serialize)]
1655        struct Temperature {
1656            temperature: u8,
1657        }
1658
1659        let mut buf = [0u8;15];
1660
1661        assert_eq!(
1662            to_slice_compact(&mut buf, &Temperature { temperature: 127 }).unwrap(),
1663            b"\x91\x7f");
1664        assert_eq!(
1665            to_slice(&mut buf, &Temperature { temperature: 127 }).unwrap(),
1666            b"\x81\x00\x7f");
1667        assert_eq!(
1668            to_slice_named(&mut buf, &Temperature { temperature: 127 }).unwrap(),
1669            b"\x81\xABtemperature\x7f"
1670        );
1671
1672        assert_eq!(
1673            to_slice_compact(&mut buf, &Temperature { temperature: 128 }).unwrap(),
1674            b"\x91\xCC\x80");
1675        assert_eq!(
1676            to_slice(&mut buf, &Temperature { temperature: 128 }).unwrap(),
1677            b"\x81\x00\xCC\x80");
1678        assert_eq!(
1679            to_slice_named(&mut buf, &Temperature { temperature: 128 }).unwrap(),
1680            b"\x81\xABtemperature\xCC\x80");
1681    }
1682
1683    #[test]
1684    fn test_ser_struct_f32() {
1685        #[derive(Serialize)]
1686        struct Temperature {
1687            temperature: f32,
1688        }
1689
1690        let mut buf = [0u8;18];
1691
1692        assert_eq!(
1693            to_slice_compact(&mut buf, &Temperature { temperature: -20.0 }).unwrap(),
1694            b"\x91\xCA\xc1\xa0\x00\x00");
1695        assert_eq!(
1696            to_slice(&mut buf, &Temperature { temperature: -20.0 }).unwrap(),
1697            b"\x81\x00\xCA\xc1\xa0\x00\x00");
1698        assert_eq!(
1699            to_slice_named(&mut buf, &Temperature { temperature: -20.0 }).unwrap(),
1700            b"\x81\xABtemperature\xCA\xc1\xa0\x00\x00");
1701
1702        let temp = Temperature {
1703            temperature: -2.3456789012345e-23
1704        };
1705        assert_eq!(
1706            to_slice_compact(&mut buf, &temp).unwrap(),
1707            b"\x91\xCA\x99\xe2\xdc\x32");
1708        assert_eq!(
1709            to_slice(&mut buf, &temp).unwrap(),
1710            b"\x81\x00\xCA\x99\xe2\xdc\x32");
1711        assert_eq!(
1712            to_slice_named(&mut buf, &temp).unwrap(),
1713            b"\x81\xABtemperature\xCA\x99\xe2\xdc\x32");
1714
1715        let temp = Temperature {
1716            temperature: f32::NAN
1717        };
1718        assert_eq!(
1719            to_slice_compact(&mut buf, &temp).unwrap(),
1720            b"\x91\xCA\x7f\xc0\x00\x00");
1721        assert_eq!(
1722            to_slice(&mut buf, &temp).unwrap(),
1723            b"\x81\x00\xCA\x7f\xc0\x00\x00");
1724        assert_eq!(
1725            to_slice_named(&mut buf, &temp).unwrap(),
1726            b"\x81\xABtemperature\xCA\x7f\xc0\x00\x00");
1727
1728        let temp = Temperature {
1729            temperature: f32::NEG_INFINITY
1730        };
1731        assert_eq!(
1732            to_slice_compact(&mut buf, &temp).unwrap(),
1733            b"\x91\xCA\xff\x80\x00\x00");
1734        assert_eq!(
1735            to_slice(&mut buf, &temp).unwrap(),
1736            b"\x81\x00\xCA\xff\x80\x00\x00");
1737        assert_eq!(
1738            to_slice_named(&mut buf, &temp).unwrap(),
1739            b"\x81\xABtemperature\xCA\xff\x80\x00\x00");
1740    }
1741
1742    #[test]
1743    fn test_ser_struct_option() {
1744        #[derive(Serialize)]
1745        struct Property<'a> {
1746            #[serde(skip_serializing_if = "Option::is_none")]
1747            description: Option<&'a str>,
1748            value: Option<u32>,
1749        }
1750        #[derive(Serialize)]
1751        struct Skippable<'a> {
1752            value: Option<u32>,
1753            #[serde(skip_serializing_if = "Option::is_none")]
1754            description: Option<&'a str>
1755        }
1756
1757        let mut buf = [0u8;54];
1758
1759        assert_eq!(
1760            to_slice_compact(&mut buf, &Property {
1761                description: Some("An ambient temperature sensor"), value: None,
1762            })
1763            .unwrap(),
1764            b"\x92\xBDAn ambient temperature sensor\xC0");
1765        assert_eq!(
1766            to_slice(&mut buf, &Property {
1767                description: Some("An ambient temperature sensor"), value: None,
1768            })
1769            .unwrap(),
1770            b"\x82\x00\xBDAn ambient temperature sensor\x01\xC0");
1771        assert_eq!(
1772            to_slice_named(&mut buf, &Property {
1773                description: Some("An ambient temperature sensor"), value: None,
1774            })
1775            .unwrap(),
1776            b"\x82\xABdescription\xBDAn ambient temperature sensor\xA5value\xC0");
1777
1778        let property = Property { description: None, value: None };
1779        assert_eq!(to_slice_compact(&mut buf, &property), Err(Error::FieldSkipped));
1780        assert_eq!(to_slice(&mut buf, &property).unwrap(), b"\x81\x01\xC0");
1781        assert_eq!(to_slice_named(&mut buf, &property).unwrap(), b"\x81\xA5value\xC0");
1782
1783        let property = Property { description: None, value: Some(0) };
1784        assert_eq!(to_slice_compact(&mut buf, &property), Err(Error::FieldSkipped));
1785        assert_eq!(to_slice(&mut buf, &property).unwrap(), b"\x81\x01\x00");
1786        assert_eq!(to_slice_named(&mut buf, &property).unwrap(), b"\x81\xA5value\x00");
1787
1788        let property = Property {
1789            description: Some("Answer to the Ultimate Question?"),
1790            value: Some(42)
1791        };
1792        assert_eq!(
1793            to_slice_compact(&mut buf, &property).unwrap(),
1794            b"\x92\xD9\x20Answer to the Ultimate Question?\x2A");
1795        assert_eq!(
1796            to_slice(&mut buf, &property).unwrap(),
1797            b"\x82\x00\xD9\x20Answer to the Ultimate Question?\x01\x2A");
1798        assert_eq!(
1799            to_slice_named(&mut buf, &property).unwrap(),
1800            b"\x82\xABdescription\xD9\x20Answer to the Ultimate Question?\xA5value\x2A");
1801
1802        let skippable = Skippable { value: None, description: None};
1803        assert_eq!(to_slice_compact(&mut buf, &skippable).unwrap(), b"\x91\xC0");
1804        assert_eq!(to_slice(&mut buf, &skippable).unwrap(), b"\x81\x00\xC0");
1805        assert_eq!(to_slice_named(&mut buf, &skippable).unwrap(), b"\x81\xA5value\xC0");
1806
1807        let skippable = Skippable { value: Some(0), description: None};
1808        assert_eq!(to_slice_compact(&mut buf, &skippable).unwrap(), b"\x91\x00");
1809        assert_eq!(to_slice(&mut buf, &skippable).unwrap(), b"\x81\x00\x00");
1810        assert_eq!(to_slice_named(&mut buf, &skippable).unwrap(), b"\x81\xA5value\x00");
1811    }
1812
1813    #[test]
1814    fn test_ser_struct_() {
1815        #[derive(Serialize)]
1816        struct Empty {}
1817
1818        let mut buf = [0u8;7];
1819
1820        assert_eq!(to_slice_compact(&mut buf, &Empty {}).unwrap(), &[0x90]);
1821        assert_eq!(to_slice(&mut buf, &Empty {}).unwrap(), &[0x80]);
1822        assert_eq!(to_slice_named(&mut buf, &Empty {}).unwrap(), &[0x80]);
1823
1824        #[derive(Serialize)]
1825        struct Tuple {
1826            a: bool,
1827            b: bool,
1828        }
1829
1830        let tuple = Tuple { a: true, b: false };
1831        assert_eq!(
1832            to_slice_compact(&mut buf, &tuple).unwrap(),
1833            b"\x92\xC3\xC2");
1834        assert_eq!(
1835            to_slice(&mut buf, &tuple).unwrap(),
1836            b"\x82\x00\xC3\x01\xC2");
1837        assert_eq!(
1838            to_slice_named(&mut buf, &tuple).unwrap(),
1839            b"\x82\xA1a\xC3\xA1b\xC2");
1840        // errors
1841        for len in 0..3 {
1842            assert_eq!(to_slice_compact(&mut buf[..len], &tuple), Err(Error::Writer(SerError::BufferFull)));
1843        }
1844        for len in 0..5 {
1845            assert_eq!(to_slice(&mut buf[..len], &tuple), Err(Error::Writer(SerError::BufferFull)));
1846        }
1847        for len in 0..buf.len() {
1848            assert_eq!(to_slice_named(&mut buf[..len], &tuple), Err(Error::Writer(SerError::BufferFull)));
1849        }
1850    }
1851
1852    #[test]
1853    fn test_ser_unit() {
1854        let mut buf = [0u8;1];
1855        let a = ();
1856        assert_eq!(to_slice(&mut buf, &a).unwrap(), b"\xC0");
1857        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), b"\xC0");
1858        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), b"\xC0");
1859        #[derive(Serialize)]
1860        struct Unit;
1861        let a = Unit;
1862        assert_eq!(to_slice(&mut buf, &a).unwrap(), b"\xC0");
1863        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), b"\xC0");
1864        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), b"\xC0");
1865        // errors
1866        assert_eq!(to_slice_compact(&mut buf[..0], &a), Err(Error::Writer(SerError::BufferFull)));
1867        assert_eq!(to_slice(&mut buf[..0], &a), Err(Error::Writer(SerError::BufferFull)));
1868        assert_eq!(to_slice_named(&mut buf[..0], &a), Err(Error::Writer(SerError::BufferFull)));
1869    }
1870
1871    #[test]
1872    fn test_ser_newtype_struct() {
1873        #[derive(Serialize)]
1874        struct A(u32);
1875        let mut buf = [0u8;1];
1876        let a = A(54);
1877        assert_eq!(to_slice(&mut buf, &a).unwrap(), &[54]);
1878        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), &[54]);
1879        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), &[54]);
1880        // errors
1881        assert_eq!(to_slice(&mut buf[..0], &a), Err(Error::Writer(SerError::BufferFull)));
1882        assert_eq!(to_slice_compact(&mut buf[..0], &a), Err(Error::Writer(SerError::BufferFull)));
1883        assert_eq!(to_slice_named(&mut buf[..0], &a), Err(Error::Writer(SerError::BufferFull)));
1884    }
1885
1886    #[test]
1887    fn test_ser_newtype_variant() {
1888        #[derive(Serialize)]
1889        enum A {
1890            A(u32),
1891        }
1892        let mut buf = [0u8;4];
1893
1894        let a = A::A(54);
1895        assert_eq!(to_slice(&mut buf, &a).unwrap(), &[0x81,0x00,54]);
1896        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), &[0x81,0x00,54]);
1897        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), &[0x81,0xA1,b'A',54]);
1898        // errors
1899        for len in 0..3 {
1900            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));            
1901            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1902        }
1903        for len in 0..buf.len() {
1904            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1905        }
1906    }
1907
1908    #[test]
1909    fn test_ser_struct_variant() {
1910        #[derive(Serialize)]
1911        enum A {
1912            A { x: u32, y: u16 },
1913        }
1914        let mut buf = [0u8;12];
1915        let a = A::A { x: 54, y: 720 };
1916
1917        assert_eq!(
1918            to_slice_compact(&mut buf, &a).unwrap(),
1919            &[0x81,0x00, 0x92,54, 0xCD,0x02,0xD0]);
1920        assert_eq!(
1921            to_slice(&mut buf, &a).unwrap(),
1922            &[0x81,0x00, 0x82,0x00,54, 0x01,0xCD,0x02,0xD0]);
1923        assert_eq!(
1924            to_slice_named(&mut buf, &a).unwrap(),
1925            &[0x81,0xA1,b'A', 0x82,0xA1,b'x',54, 0xA1,b'y',0xCD,0x02,0xD0]);
1926        // errors
1927        for len in 0..7 {
1928            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1929        }
1930        for len in 0..9 {
1931            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1932        }
1933        for len in 0..buf.len() {
1934            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1935        }
1936    }
1937
1938    #[test]
1939    fn test_ser_struct_variant_option() {
1940        #[derive(Serialize)]
1941        enum A<'a> {
1942            A {
1943                #[serde(skip_serializing_if = "Option::is_none")]
1944                x: Option<&'a str>,
1945                #[serde(skip_serializing_if = "Option::is_none")]
1946                y: Option<u16>
1947            }
1948        }
1949        let mut buf = [0u8;15];
1950        let a = A::A { x: Some("foo"), y: Some(720) };
1951
1952        assert_eq!(
1953            to_slice_compact(&mut buf, &a).unwrap(),
1954            &[0x81,0x00, 0x92, 0xA3,b'f',b'o',b'o', 0xCD,0x02,0xd0]);
1955        assert_eq!(
1956            to_slice(&mut buf, &a).unwrap(),
1957            &[0x81,0x00, 0x82, 0x00,0xA3,b'f',b'o',b'o', 0x01,0xCD,0x02,0xd0]);
1958        assert_eq!(
1959            to_slice_named(&mut buf, &a).unwrap(),
1960            &[0x81,0xA1,b'A', 0x82, 0xA1,b'x',0xA3,b'f',b'o',b'o', 0xA1,b'y',0xCD,0x02,0xd0]);
1961        // errors
1962        for len in 0..10 {
1963            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1964        }
1965        for len in 0..12 {
1966            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1967        }
1968        for len in 0..buf.len() {
1969            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
1970        }
1971        let a = A::A { x: None, y: None };
1972        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), b"\x81\x00\x90");
1973        assert_eq!(to_slice(&mut buf, &a).unwrap(), b"\x81\x00\x80");
1974        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), b"\x81\xA1A\x80");
1975        let a = A::A { x: Some("foo"), y: None };
1976        assert_eq!(to_slice_compact(&mut buf, &a).unwrap(), b"\x81\x00\x91\xA3foo");
1977        assert_eq!(to_slice(&mut buf, &a).unwrap(), b"\x81\x00\x81\x00\xA3foo");
1978        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), b"\x81\xA1A\x81\xA1x\xA3foo");
1979        let a = A::A { x: None, y: Some(720) };
1980        assert_eq!(to_slice_compact(&mut buf, &a), Err(Error::FieldSkipped));
1981        assert_eq!(to_slice(&mut buf, &a).unwrap(), b"\x81\x00\x81\x01\xCD\x02\xd0");
1982        assert_eq!(to_slice_named(&mut buf, &a).unwrap(), b"\x81\xA1A\x81\xA1y\xCD\x02\xd0");
1983    }
1984
1985    #[test]
1986    fn test_ser_tuple_variant() {
1987        #[derive(Serialize)]
1988        enum A {
1989            A(u32, u16),
1990        }
1991        let mut buf = [0u8;8];
1992        let a = A::A(54, 720);
1993
1994        assert_eq!(
1995            to_slice_compact(&mut buf, &a).unwrap(),
1996            &[0x81,0x00, 0x92,54, 0xCD,0x02,0xD0]);
1997        assert_eq!(
1998            to_slice(&mut buf, &a).unwrap(),
1999            &[0x81,0x00, 0x92,54, 0xCD,0x02,0xD0]);
2000        assert_eq!(
2001            to_slice_named(&mut buf, &a).unwrap(),
2002            &[0x81,0xA1,b'A', 0x92,54, 0xCD,0x02,0xD0]);
2003        // errors
2004        for len in 0..7 {
2005            assert_eq!(to_slice_compact(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
2006            assert_eq!(to_slice(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
2007        }
2008        for len in 0..buf.len() {
2009            assert_eq!(to_slice_named(&mut buf[..len], &a), Err(Error::Writer(SerError::BufferFull)));
2010        }
2011    }
2012
2013    #[test]
2014    fn test_ser_tuple_struct() {
2015        #[derive(Serialize)]
2016        struct A<'a>(u32, Option<&'a str>, u16, bool);
2017
2018        let mut buf = [0u8;15];
2019        let a = A(42, Some("A string"), 720, false);
2020
2021        assert_eq!(
2022            to_slice_compact(&mut buf, &a).unwrap(),
2023            b"\x94\x2A\xA8A string\xCD\x02\xD0\xC2");
2024        assert_eq!(
2025            to_slice(&mut buf, &a).unwrap(),
2026            b"\x94\x2A\xA8A string\xCD\x02\xD0\xC2");
2027        assert_eq!(
2028            to_slice_named(&mut buf, &a).unwrap(),
2029            b"\x94\x2A\xA8A string\xCD\x02\xD0\xC2");
2030    }
2031
2032    #[test]
2033    fn test_ser_str_array_map_oversize_errors() {
2034        let mut writer = SliceWriter::new(&mut []);
2035        let oversize = usize::try_from(u32::MAX).unwrap();
2036        assert_eq!(write_str_len(&mut writer, oversize), Err(Error::from(SerError::BufferFull)));
2037        assert_eq!(write_array_len(&mut writer, oversize), Err(Error::from(SerError::BufferFull)));
2038        assert_eq!(write_map_len(&mut writer, oversize), Err(Error::from(SerError::BufferFull)));
2039        let oversize = oversize.checked_add(1).unwrap();
2040        assert_eq!(write_str_len(&mut writer, oversize), Err(Error::StrLength));
2041        assert_eq!(write_array_len(&mut writer, oversize), Err(Error::SeqLength));
2042        assert_eq!(write_map_len(&mut writer, oversize), Err(Error::MapLength));
2043    }
2044
2045    #[test]
2046    fn test_data_oversize_errors() {
2047        let oversize = usize::try_from(u32::MAX).unwrap().checked_add(1).unwrap();
2048        // SAFETY: this is safe only when a test succeeds, meaning
2049        // the provided slice is never read from.
2050        let impossible_bytes = unsafe {
2051            let ptr = core::ptr::NonNull::<u8>::dangling().as_ptr();
2052            core::slice::from_raw_parts(ptr, oversize)
2053        };
2054        #[derive(Serialize)]
2055        struct Test<'a> {
2056            #[serde(with = "serde_bytes")]
2057            key: &'a[u8]
2058        }
2059        let value = Test { key: impossible_bytes };
2060        assert_eq!(
2061            to_slice_compact(&mut [0u8], &value),
2062            Err(Error::DataLength));
2063    }
2064
2065    #[test]
2066    fn test_ser_tuple_struct_roundtrip() {
2067        use serde::Deserialize;
2068
2069        #[derive(Debug, Deserialize, Serialize, PartialEq, Eq)]
2070        struct A<'a>(u32, Option<&'a str>, u16, bool);
2071
2072        let mut buf = [0u8;25];
2073        let a1 = A(42, Some("A string"), 720, false);
2074
2075        let mut writer = SliceWriter::new(&mut buf);
2076        to_writer(&mut writer, &a1).unwrap();
2077        let mut serialized = writer.split().0;
2078        let (a2, len): (A<'_>, _) = crate::from_slice(&mut serialized).unwrap();
2079        assert_eq!(len, 15);
2080        assert_eq!(a1, a2);
2081    }
2082
2083    #[cfg(any(feature = "std", feature = "alloc"))]
2084    #[test]
2085    fn test_ser_error_string() {
2086        assert_eq!(format!("{}", Error::from(SerError::BufferFull)), "buffer is full");
2087        assert_eq!(format!("{}", Error::<SerError>::MapLength), "unknown or invalid map length");
2088        assert_eq!(format!("{}", Error::<SerError>::SeqLength), "unknown or invalid sequence length");
2089        assert_eq!(format!("{}", Error::<SerError>::StrLength), "invalid string length");
2090        assert_eq!(format!("{}", Error::<SerError>::DataLength), "invalid byte array length");
2091        assert_eq!(format!("{}", Error::<SerError>::FieldSkipped), "skipped a field in a middle of struct");
2092        assert_eq!(format!("{}", Error::<SerError>::FormatError), "error collecting a string");
2093        let custom: Error<SerError> = serde::ser::Error::custom("xxx");
2094        assert_eq!(format!("{}", custom), "xxx while serializing MessagePack");
2095    }
2096
2097    #[cfg(not(any(feature = "std", feature = "alloc")))]
2098    #[test]
2099    fn test_ser_error_fmt() {
2100        use core::fmt::Write;
2101        let mut buf = [0u8;35];
2102        let mut writer = SliceWriter::new(&mut buf);
2103        let custom: Error<SerError> = serde::ser::Error::custom("xxx");
2104        write!(writer, "{}", custom).unwrap();
2105        assert_eq!(writer.as_ref(), b"error while serializing MessagePack");
2106    }
2107}