1use 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
17pub struct CompactSerializer<W> {
21 output: W
22}
23
24pub struct StructMapIdxSerializer<W> {
26 output: W
27}
28
29pub 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
64pub 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
78pub 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
90pub 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#[derive(Debug, Clone, PartialEq, Eq, Hash)]
104#[non_exhaustive]
105pub enum Error<E> {
106 Writer(E),
108 MapLength,
110 SeqLength,
112 StrLength,
114 DataLength,
116 FieldSkipped,
118 FormatError,
120 #[cfg(any(feature = "std", feature = "alloc"))]
121 #[cfg_attr(docsrs, doc(cfg(any(feature = "std", feature = "alloc"))))]
122 SerializeError(String),
124 #[cfg(not(any(feature = "std", feature = "alloc")))]
125 SerializeError
126}
127
128pub 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 #[inline(always)]
214 pub fn new(output: W) -> Self {
215 $serializer { output }
216 }
217 #[inline(always)]
219 pub fn into_inner(self) -> W {
220 self.output
221 }
222 #[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 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 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 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!(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
720impl<'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
779impl<'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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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"); assert_eq!(to_slice_compact(&mut buf, "\u{A0}").unwrap(), b"\xA2\xC2\xA0"); assert_eq!(to_slice_named(&mut buf, "\u{A0}").unwrap(), b"\xA2\xC2\xA0"); assert_eq!(to_slice(&mut buf, "ℝ").unwrap(), b"\xA3\xe2\x84\x9d"); assert_eq!(to_slice(&mut buf, "💣").unwrap(), b"\xA4\xf0\x9f\x92\xa3"); assert_eq!(to_slice_compact(&mut buf, "💣").unwrap(), b"\xA4\xf0\x9f\x92\xa3"); assert_eq!(to_slice_named(&mut buf, "💣").unwrap(), b"\xA4\xf0\x9f\x92\xa3"); 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"); assert_eq!(to_slice_compact(&mut buf, &'\u{A0}').unwrap(), b"\xA2\xC2\xA0"); assert_eq!(to_slice_named(&mut buf, &'\u{A0}').unwrap(), b"\xA2\xC2\xA0"); assert_eq!(to_slice(&mut buf, &'ℝ').unwrap(), b"\xA3\xe2\x84\x9d"); assert_eq!(to_slice(&mut buf, &'💣').unwrap(), b"\xA4\xf0\x9f\x92\xa3"); assert_eq!(to_slice_compact(&mut buf, &'💣').unwrap(), b"\xA4\xf0\x9f\x92\xa3"); assert_eq!(to_slice_named(&mut buf, &'💣').unwrap(), b"\xA4\xf0\x9f\x92\xa3"); 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}