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 #[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 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 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 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!(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
725impl<'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
784impl<'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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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"); 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");
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"); 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");
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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}