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