msgpack_schema/
lib.rs

1//! _msgpack-schema_ is a schema language for describing data formats encoded in MessagePack.
2//! It provides two derive macros `Serialize` and `Deserialize` that allow you to transcode MessagePack binary data to/from Rust data structures in a type-directed way.
3//!
4//! ```rust
5//! use msgpack_schema::{Deserialize, Serialize};
6//!
7//! #[derive(Deserialize, Serialize)]
8//! struct Human {
9//!     #[tag = 0]
10//!     name: String,
11//!     #[tag = 2]
12//!     #[optional]
13//!     age: Option<u32>,
14//! }
15//! ```
16//!
17//! Compared with other schema languages like `rmp-serde`, `msgpack-schema` allows to specify more compact data representation, e.g., fixints as field keys, fixints as variant keys, etc.
18//!
19//! # Feature flags
20//!
21//! - `proptest`: Enable `proptest::arbitrary::Arbitrary` impls for `msgpack_value::Value`.
22//!
23//! # Behaviours of serializers and deserializers
24//!
25//! ## Structs with named fields
26//!
27//! Structs with named fields are serialized into a `Map` object where keys are fixints specified by `#[tag]` attributes.
28//! The current implementation serializes fields in order but one must not rely on this behavior.
29//!
30//! The deserializer interprets `Map` objects to create such structs.
31//! Field order is irrelevant to the result.
32//! If `Map` objects contains extra key-value pairs which are not contained in the definition of the struct, the deserializer simply ignores them.
33//! If there are two or more values with the same key within a `Map` object, the preceding value is overwritten by the last value.
34//!
35//! ```
36//! # use msgpack_schema::*;
37//! # #[derive(Debug, PartialEq, Eq)]
38//! #[derive(Serialize, Deserialize)]
39//! struct S {
40//!     #[tag = 0]
41//!     x: u32,
42//!     #[tag = 1]
43//!     y: String,
44//! }
45//!
46//! let s = S {
47//!   x: 42,
48//!   y: "hello".to_owned(),
49//! };
50//!
51//! let b = b"\x82\x00\x2A\x01\xA5\x68\x65\x6c\x6c\x6f"; // 10 bytes; `{ 0: 42, 1: "hello" }`
52//! assert_eq!(serialize(&s), b);
53//! assert_eq!(s, deserialize(b).unwrap());
54//!
55//! // ignores irrelevant key-value pairs
56//! let b = b"\x83\x00\x2A\x02\xC3\x01\xA5\x68\x65\x6c\x6c\x6f"; // 12 bytes; `{ 0: 42, 2: true, 1: "hello" }`
57//! assert_eq!(s, deserialize(b).unwrap());
58//!
59//! // last value wins
60//! let b = b"\x83\x00\xC3\x00\x2A\x01\xA5\x68\x65\x6c\x6c\x6f"; // 12 bytes; `{ 0: true, 0: 42, 1: "hello" }`
61//! assert_eq!(s, deserialize(b).unwrap());
62//! ```
63//!
64//! Fields in named structs may be tagged with `#[optional]`.
65//!
66//! - The tagged field must be of type `Option<T>`.
67//! - On serialization, the key-value pair will not be included in the result map object when the field data contains `None`.
68//! - On deserialization, the field of the result struct will be filled with `None` when the given MsgPack map object contains no corresponding key-value pair.
69//!
70//! ```
71//! # use msgpack_schema::*;
72//! # #[derive(Debug, PartialEq, Eq)]
73//! #[derive(Serialize, Deserialize)]
74//! struct S {
75//!     #[tag = 0]
76//!     x: u32,
77//!     #[optional]
78//!     #[tag = 1]
79//!     y: Option<String>,
80//! }
81//!
82//! let s = S {
83//!   x: 42,
84//!   y: Some("hello".to_owned()),
85//! };
86//! let b = b"\x82\x00\x2A\x01\xA5\x68\x65\x6c\x6c\x6f"; // 10 bytes; `{ 0: 42, 1: "hello" }`
87//! assert_eq!(serialize(&s), b);
88//! assert_eq!(s, deserialize(b).unwrap());
89//!
90//! let s = S {
91//!   x: 42,
92//!   y: None,
93//! };
94//! let b = b"\x81\x00\x2A"; // 3 bytes; `{ 0: 42 }`
95//! assert_eq!(serialize(&s), b);
96//! assert_eq!(s, deserialize(b).unwrap());
97//! ```
98//!
99//! The `#[flatten]` attribute is used to factor out a single definition of named struct into multiple ones.
100//!
101//! ```
102//! # use msgpack_schema::*;
103//! #[derive(Serialize)]
104//! struct S1 {
105//!     #[tag = 1]
106//!     x: u32,
107//! }
108//!
109//! #[derive(Serialize)]
110//! struct S2 {
111//!     #[flatten]
112//!     s1: S1,
113//!     #[tag = 2]
114//!     y: u32,
115//! }
116//!
117//! #[derive(Serialize)]
118//! struct S3 {
119//!     #[tag = 1]
120//!     x: u32,
121//!     #[tag = 2]
122//!     y: u32,
123//! }
124//!
125//! assert_eq!(serialize(S2 { s1: S1 { x: 42 }, y: 43, }), serialize(S3 { x: 42, y: 43 }));
126//! ```
127//!
128//! Structs with named fields may be attached `#[untagged]`.
129//! Untagged structs are serialized into an array and will not contain tags.
130//!
131//! ```
132//! # use msgpack_schema::*;
133//! # #[derive(Debug, PartialEq, Eq)]
134//! #[derive(Serialize, Deserialize)]
135//! #[untagged]
136//! struct S {
137//!     x: u32,
138//!     y: String,
139//! }
140//!
141//! let s = S {
142//!   x: 42,
143//!   y: "hello".to_owned(),
144//! };
145//! let b = b"\x92\x2A\xA5\x68\x65\x6c\x6c\x6f"; // 8 bytes; `[ 42, "hello" ]`
146//!
147//! assert_eq!(serialize(&s), b);
148//! assert_eq!(s, deserialize(b).unwrap());
149//! ```
150//!
151//! ## Newtype structs
152//!
153//! Tuple structs with only one element are treated transparently.
154//!
155//! ```
156//! # use msgpack_schema::*;
157//! # #[derive(Debug, PartialEq, Eq)]
158//! #[derive(Serialize, Deserialize)]
159//! struct S(u32);
160//!
161//! let s = S(42);
162//! let b = b"\x2A"; // 1 byte; `42`
163//!
164//! assert_eq!(serialize(&s), b);
165//! assert_eq!(s, deserialize(b).unwrap());
166//! ```
167//!
168//! ## Unit structs and empty tuple structs
169//!
170//! Serialization and deserialization of unit structs and empty tuple structs are intentionally unsupported.
171//!
172//! ```
173//! // It is error to derive `Serialize` / `Deserialize` for these types of structs.
174//! struct S1;
175//! struct S2();
176//! ```
177//!
178//! ## Tuple structs
179//!
180//! Tuple structs with more than one element are encoded as an array.
181//! It is validation error to deserialize an array with unmatched length.
182//!
183//! ```
184//! # use msgpack_schema::*;
185//! # #[derive(Debug, PartialEq, Eq)]
186//! #[derive(Serialize, Deserialize)]
187//! struct S(u32, bool);
188//!
189//! let s = S(42, true);
190//! let b = b"\x92\x2A\xC3"; // 3 bytes; `[ 42, true ]`
191//!
192//! assert_eq!(serialize(&s), b);
193//! assert_eq!(s, deserialize(b).unwrap());
194//! ```
195//!
196//! ## Unit variants and empty tuple variants
197//!
198//! Unit variants and empty tuple variants are serialized into a single fixint whose value is determined by the tag.
199//!
200//! ```
201//! # use msgpack_schema::*;
202//! # #[derive(Debug, PartialEq, Eq)]
203//! #[derive(Serialize, Deserialize)]
204//! enum E {
205//!     #[tag = 3]
206//!     Foo
207//! }
208//!
209//! let e = E::Foo;
210//! let b = b"\x03"; // 1 byte; `3`
211//!
212//! assert_eq!(serialize(&e), b);
213//! assert_eq!(e, deserialize(b).unwrap());
214//! ```
215//!
216//! ```
217//! # use msgpack_schema::*;
218//! # #[derive(Debug, PartialEq, Eq)]
219//! #[derive(Serialize, Deserialize)]
220//! enum E {
221//!     #[tag = 3]
222//!     Foo()
223//! }
224//!
225//! let e = E::Foo();
226//! let b = b"\x03"; // 1 byte; `3`
227//!
228//! assert_eq!(serialize(&e), b);
229//! assert_eq!(e, deserialize(b).unwrap());
230//! ```
231//!
232//! ## Newtype variants
233//!
234//! Newtype variants (one-element tuple variants) are serialized into an array of the tag and the inner value.
235//!
236//! ```
237//! # use msgpack_schema::*;
238//! # #[derive(Debug, PartialEq, Eq)]
239//! #[derive(Serialize, Deserialize)]
240//! enum E {
241//!     #[tag = 3]
242//!     Foo(u32)
243//! }
244//!
245//! let e = E::Foo(42);
246//! let b = b"\x92\x03\x2A"; // 3 bytes; `[ 3, 42 ]`
247//!
248//! assert_eq!(serialize(&e), b);
249//! assert_eq!(e, deserialize(b).unwrap());
250//! ```
251//!
252//! ## Untagged variants
253//!
254//! Enums may be attached `#[untagged]` when all variants are newtype variants.
255//! Serializing untagged variants results in the same data layout as the inner type.
256//! The deserializer deserializes into an untagged enum type by trying deserization one by one from the first variant to the last.
257//!
258//! ```
259//! # use msgpack_schema::*;
260//! # #[derive(Debug, PartialEq, Eq)]
261//! #[derive(Serialize, Deserialize)]
262//! #[untagged]
263//! enum E {
264//!     Foo(String),
265//!     Bar(u32),
266//! }
267//!
268//! let e = E::Bar(42);
269//! let b = b"\x2A"; // 1 byte; `42`
270//!
271//! assert_eq!(serialize(&e), b);
272//! assert_eq!(e, deserialize(b).unwrap());
273//! ```
274//!
275//! # Write your own implementation of `Serialize` and `Deserialize`
276//!
277//! You may want to write your own implementation of `Serialize` and `Deserialize` in the following cases:
278//!
279//! 1. You need `impl` for types that are already defined by someone.
280//! 2. You need extreme efficiency.
281//! 3. Both.
282//!
283//! [IpAddr](std::net::IpAddr) is such a type satisfying (3).
284//! In the most efficient situation, we want it to be 4 or 16 byte length plus one byte for a tag at any time.
285//! This is achieved by giving a hard-written implementation like below.
286//!
287//! ```
288//! # use msgpack_schema::*;
289//! # use msgpack_value::*;
290//! struct IpAddr(pub std::net::IpAddr);
291//!
292//! impl Serialize for IpAddr {
293//!     fn serialize(&self, serializer: &mut Serializer) {
294//!         match self.0 {
295//!             std::net::IpAddr::V4(v4) => {
296//!                 serializer.serialize_str(&v4.octets()); // 5 bytes
297//!             }
298//!             std::net::IpAddr::V6(v6) => {
299//!                 serializer.serialize_str(&v6.octets()); // 17 bytes
300//!             }
301//!         }
302//!     }
303//! }
304//!
305//! impl Deserialize for IpAddr {
306//!     fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
307//!         let Str(data) = deserializer.deserialize()?;
308//!         let ipaddr = match data.len() {
309//!             4 => std::net::IpAddr::V4(std::net::Ipv4Addr::from(
310//!                 <[u8; 4]>::try_from(data).unwrap(),
311//!             )),
312//!             16 => std::net::IpAddr::V6(std::net::Ipv6Addr::from(
313//!                 <[u8; 16]>::try_from(data).unwrap(),
314//!             )),
315//!             _ => return Err(ValidationError.into()),
316//!         };
317//!         Ok(Self(ipaddr))
318//!     }
319//! }
320//! ```
321//!
322//! # Appendix: Cheatsheet
323//!
324//! <table>
325//!     <tr>
326//!         <th>schema</th>
327//!         <th>Rust</th>
328//!         <th>MessagePack (human readable)</th>
329//!     </tr>
330//!     <tr>
331//!         <td>
332//!             <pre><code>struct S {
333//!     #[tag = 0]
334//!     x: u32,
335//!     #[tag = 1]
336//!     y: bool,
337//! }
338//! </code></pre>
339//!         </td>
340//!         <td>
341//!             <code>S { x: 42, y: true }</code>
342//!         </td>
343//!         <td>
344//!             <code>{ 0: 42, 1: true }</code>
345//!         </td>
346//!     </tr>
347//!     <tr>
348//!         <td>
349//!             <pre><code>struct S {
350//!     #[optional]
351//!     #[tag = 0]
352//!     x: Option&lt;u32&gt;,
353//! }
354//! </code></pre>
355//!         </td>
356//!         <td>
357//!             <code>S { x: Some(42) }</code>
358//!         </td>
359//!         <td>
360//!             <code>{ 0: 42 }</code>
361//!         </td>
362//!     </tr>
363//!     <tr>
364//!         <td>
365//!             <pre><code>struct S {
366//!     #[optional]
367//!     #[tag = 0]
368//!     x: Option&lt;u32&gt;,
369//! }
370//! </code></pre>
371//!         </td>
372//!         <td>
373//!             <code>S { x: None }</code>
374//!         </td>
375//!         <td>
376//!             <code>{}</code>
377//!         </td>
378//!     </tr>
379//!     <tr>
380//!         <td>
381//!             <pre><code>#[untagged]
382//! struct S {
383//!     #[tag = 0]
384//!     x: u32,
385//!     #[tag = 1]
386//!     y: bool,
387//! }
388//! </code></pre>
389//!         </td>
390//!         <td>
391//!             <code>S { x: 42, y: true }</code>
392//!         </td>
393//!         <td>
394//!             <code>[ 42, true ]</code>
395//!         </td>
396//!     </tr>
397//!     <tr>
398//!         <td>
399//!             <code>struct S(u32)</code>
400//!         </td>
401//!         <td>
402//!             <code>S(42)</code>
403//!         </td>
404//!         <td>
405//!             <code>42</code>
406//!         </td>
407//!     </tr>
408//!     <tr>
409//!         <td>
410//!             <code>struct S</code>
411//!         </td>
412//!         <td>
413//!             <code>S</code>
414//!         </td>
415//!         <td>UNSUPPORTED</td>
416//!     </tr>
417//!     <tr>
418//!         <td>
419//!             <code>struct S()</code>
420//!         </td>
421//!         <td>
422//!             <code>S()</code>
423//!         </td>
424//!         <td>UNSUPPORTED</td>
425//!     </tr>
426//!     <tr>
427//!         <td>
428//!             <code>struct S(u32, bool)</code>
429//!         </td>
430//!         <td>
431//!             <code>S(42, true)</code>
432//!         </td>
433//!         <td>
434//!             <code>[ 42, true ]</code>
435//!         </td>
436//!     </tr>
437//!     <tr>
438//!         <td>
439//!             <pre><code>enum E {
440//!     #[tag = 3]
441//!     Foo
442//! }</code></pre>
443//!         </td>
444//!         <td>
445//!             <code>E::Foo</code>
446//!         </td>
447//!         <td>
448//!             <code>3</code>
449//!         </td>
450//!     </tr>
451//!     <tr>
452//!         <td>
453//!             <pre><code>enum E {
454//!     #[tag = 3]
455//!     Foo()
456//! }</code></pre>
457//!         </td>
458//!         <td>
459//!             <code>E::Foo()</code>
460//!         </td>
461//!         <td>
462//!             <code>3</code>
463//!         </td>
464//!     </tr>
465//!     <tr>
466//!         <td>
467//!             <pre><code>enum E {
468//!     #[tag = 3]
469//!     Foo(u32)
470//! }</code></pre>
471//!         </td>
472//!         <td>
473//!             <code>E::Foo(42)</code>
474//!         </td>
475//!         <td>
476//!             <code>[ 3, 42 ]</code>
477//!         </td>
478//!     </tr>
479//!     <tr>
480//!         <td>
481//!             <pre><code>#[untagged]
482//! enum E {
483//!     Foo(u32)
484//!     Bar(bool)
485//! }</code></pre>
486//!         </td>
487//!         <td>
488//!             <code>E::Bar(true)</code>
489//!         </td>
490//!         <td>
491//!             <code>true</code>
492//!         </td>
493//!     </tr>
494//! </table>
495//!
496
497use byteorder::BigEndian;
498use byteorder::{self, ReadBytesExt};
499pub use msgpack_schema_impl::*;
500use msgpack_value::Value;
501use msgpack_value::{Bin, Ext, Int, Str};
502use std::convert::TryFrom;
503use std::convert::TryInto;
504use std::io::Write;
505use thiserror::Error;
506
507/// This type holds all intermediate states during serialization.
508pub struct Serializer {
509    w: Vec<u8>,
510}
511
512impl Serializer {
513    fn new() -> Self {
514        Self { w: vec![] }
515    }
516    fn with_vec(w: Vec<u8>) -> Self {
517        Self { w }
518    }
519    fn into_inner(self) -> Vec<u8> {
520        self.w
521    }
522
523    pub fn serialize_nil(&mut self) {
524        rmp::encode::write_nil(&mut self.w).unwrap()
525    }
526    pub fn serialize_bool(&mut self, v: bool) {
527        rmp::encode::write_bool(&mut self.w, v).unwrap()
528    }
529    pub fn serialize_int(&mut self, v: Int) {
530        if let Ok(v) = i64::try_from(v) {
531            rmp::encode::write_sint(&mut self.w, v).unwrap();
532        } else {
533            rmp::encode::write_uint(&mut self.w, u64::try_from(v).unwrap()).unwrap();
534        }
535    }
536    pub fn serialize_f32(&mut self, v: f32) {
537        rmp::encode::write_f32(&mut self.w, v).unwrap();
538    }
539    pub fn serialize_f64(&mut self, v: f64) {
540        rmp::encode::write_f64(&mut self.w, v).unwrap();
541    }
542    pub fn serialize_str(&mut self, v: &[u8]) {
543        rmp::encode::write_str_len(&mut self.w, v.len() as u32).unwrap();
544        self.w.write_all(v).unwrap();
545    }
546    pub fn serialize_bin(&mut self, v: &[u8]) {
547        rmp::encode::write_bin(&mut self.w, v).unwrap();
548    }
549    pub fn serialize_array(&mut self, len: u32) {
550        rmp::encode::write_array_len(&mut self.w, len).unwrap();
551    }
552    pub fn serialize_map(&mut self, len: u32) {
553        rmp::encode::write_map_len(&mut self.w, len).unwrap();
554    }
555    pub fn serialize_ext(&mut self, tag: i8, data: &[u8]) {
556        rmp::encode::write_ext_meta(&mut self.w, data.len() as u32, tag).unwrap();
557        self.w.write_all(data).unwrap();
558    }
559
560    /// Equivalent to `S::serialize(&s, self)`.
561    pub fn serialize<S: Serialize>(&mut self, s: S) {
562        S::serialize(&s, self)
563    }
564}
565
566pub trait Serialize {
567    fn serialize(&self, serializer: &mut Serializer);
568}
569
570impl<T: Serialize> Serialize for &T {
571    fn serialize(&self, serializer: &mut Serializer) {
572        T::serialize(*self, serializer)
573    }
574}
575
576impl Serialize for bool {
577    fn serialize(&self, serializer: &mut Serializer) {
578        serializer.serialize_bool(*self)
579    }
580}
581
582impl Serialize for Int {
583    fn serialize(&self, serializer: &mut Serializer) {
584        serializer.serialize_int(*self)
585    }
586}
587
588impl Serialize for u8 {
589    fn serialize(&self, serializer: &mut Serializer) {
590        serializer.serialize_int(Int::from(*self))
591    }
592}
593
594impl Serialize for u16 {
595    fn serialize(&self, serializer: &mut Serializer) {
596        serializer.serialize_int(Int::from(*self))
597    }
598}
599
600impl Serialize for u32 {
601    fn serialize(&self, serializer: &mut Serializer) {
602        serializer.serialize_int(Int::from(*self))
603    }
604}
605
606impl Serialize for u64 {
607    fn serialize(&self, serializer: &mut Serializer) {
608        serializer.serialize_int(Int::from(*self))
609    }
610}
611
612impl Serialize for i8 {
613    fn serialize(&self, serializer: &mut Serializer) {
614        serializer.serialize_int(Int::from(*self))
615    }
616}
617
618impl Serialize for i16 {
619    fn serialize(&self, serializer: &mut Serializer) {
620        serializer.serialize_int(Int::from(*self))
621    }
622}
623
624impl Serialize for i32 {
625    fn serialize(&self, serializer: &mut Serializer) {
626        serializer.serialize_int(Int::from(*self))
627    }
628}
629
630impl Serialize for i64 {
631    fn serialize(&self, serializer: &mut Serializer) {
632        serializer.serialize_int(Int::from(*self))
633    }
634}
635
636impl Serialize for f32 {
637    fn serialize(&self, serializer: &mut Serializer) {
638        serializer.serialize_f32(*self)
639    }
640}
641
642impl Serialize for f64 {
643    fn serialize(&self, serializer: &mut Serializer) {
644        serializer.serialize_f64(*self)
645    }
646}
647
648impl Serialize for Str {
649    fn serialize(&self, serializer: &mut Serializer) {
650        serializer.serialize_str(&self.0)
651    }
652}
653
654impl Serialize for str {
655    fn serialize(&self, serializer: &mut Serializer) {
656        serializer.serialize_str(self.as_bytes())
657    }
658}
659
660impl Serialize for String {
661    fn serialize(&self, serializer: &mut Serializer) {
662        serializer.serialize_str(self.as_bytes())
663    }
664}
665
666impl<T: Serialize> Serialize for [T] {
667    fn serialize(&self, serializer: &mut Serializer) {
668        serializer.serialize_array(self.len() as u32);
669        for x in self {
670            serializer.serialize(x);
671        }
672    }
673}
674
675impl<T: Serialize> Serialize for Vec<T> {
676    fn serialize(&self, serializer: &mut Serializer) {
677        serializer.serialize_array(self.len() as u32);
678        for x in self {
679            serializer.serialize(x);
680        }
681    }
682}
683
684impl<T: Serialize> Serialize for Box<T> {
685    fn serialize(&self, serializer: &mut Serializer) {
686        serializer.serialize(&**self);
687    }
688}
689
690impl<T: Serialize> Serialize for std::rc::Rc<T> {
691    fn serialize(&self, serializer: &mut Serializer) {
692        serializer.serialize(&**self);
693    }
694}
695
696impl<T: Serialize> Serialize for std::sync::Arc<T> {
697    fn serialize(&self, serializer: &mut Serializer) {
698        serializer.serialize(&**self);
699    }
700}
701
702#[doc(hidden)]
703pub trait StructSerialize: Serialize {
704    fn count_fields(&self) -> u32;
705    fn serialize_fields(&self, serializer: &mut Serializer);
706}
707
708#[derive(Debug, Clone, PartialEq)]
709pub enum Token<'a> {
710    Nil,
711    Bool(bool),
712    Int(Int),
713    F32(f32),
714    F64(f64),
715    Str(&'a [u8]),
716    Bin(&'a [u8]),
717    Array(u32),
718    Map(u32),
719    Ext { tag: i8, data: &'a [u8] },
720}
721
722/// This error type represents blob-to-MessegePack transcode errors.
723///
724/// This error type is raised during deserialization either
725/// 1. when (first bytes of) given binary data is not a message pack object, or
726/// 2. when it unexpectedly reaches the end of input.
727#[derive(Debug, Error)]
728#[error("invalid input")]
729pub struct InvalidInputError;
730
731/// This type holds all intermediate states during deserialization.
732#[derive(Clone, Copy)]
733pub struct Deserializer<'a> {
734    r: &'a [u8],
735}
736
737impl<'a> Deserializer<'a> {
738    fn new(r: &'a [u8]) -> Self {
739        Self { r }
740    }
741
742    pub fn deserialize_token(&mut self) -> Result<Token, InvalidInputError> {
743        let token = match rmp::decode::read_marker(&mut self.r).map_err(|_| InvalidInputError)? {
744            rmp::Marker::Null => Token::Nil,
745            rmp::Marker::True => Token::Bool(true),
746            rmp::Marker::False => Token::Bool(false),
747            rmp::Marker::FixPos(v) => Token::Int(Int::from(v)),
748            rmp::Marker::FixNeg(v) => Token::Int(Int::from(v)),
749            rmp::Marker::U8 => {
750                Token::Int(Int::from(self.r.read_u8().map_err(|_| InvalidInputError)?))
751            }
752            rmp::Marker::U16 => Token::Int(Int::from(
753                self.r
754                    .read_u16::<BigEndian>()
755                    .map_err(|_| InvalidInputError)?,
756            )),
757            rmp::Marker::U32 => Token::Int(Int::from(
758                self.r
759                    .read_u32::<BigEndian>()
760                    .map_err(|_| InvalidInputError)?,
761            )),
762            rmp::Marker::U64 => Token::Int(Int::from(
763                self.r
764                    .read_u64::<BigEndian>()
765                    .map_err(|_| InvalidInputError)?,
766            )),
767            rmp::Marker::I8 => {
768                Token::Int(Int::from(self.r.read_i8().map_err(|_| InvalidInputError)?))
769            }
770            rmp::Marker::I16 => Token::Int(Int::from(
771                self.r
772                    .read_i16::<BigEndian>()
773                    .map_err(|_| InvalidInputError)?,
774            )),
775            rmp::Marker::I32 => Token::Int(Int::from(
776                self.r
777                    .read_i32::<BigEndian>()
778                    .map_err(|_| InvalidInputError)?,
779            )),
780            rmp::Marker::I64 => Token::Int(Int::from(
781                self.r
782                    .read_i64::<BigEndian>()
783                    .map_err(|_| InvalidInputError)?,
784            )),
785            rmp::Marker::F32 => Token::F32(
786                self.r
787                    .read_f32::<BigEndian>()
788                    .map_err(|_| InvalidInputError)?,
789            ),
790            rmp::Marker::F64 => Token::F64(
791                self.r
792                    .read_f64::<BigEndian>()
793                    .map_err(|_| InvalidInputError)?,
794            ),
795            rmp::Marker::FixStr(len) => {
796                let len = len as usize;
797                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
798                self.r = self.r.get(len..).unwrap();
799                Token::Str(ret)
800            }
801            rmp::Marker::Str8 => {
802                let len = self.r.read_u8().map_err(|_| InvalidInputError)? as usize;
803                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
804                self.r = self.r.get(len..).unwrap();
805                Token::Str(ret)
806            }
807            rmp::Marker::Str16 => {
808                let len = self
809                    .r
810                    .read_u16::<BigEndian>()
811                    .map_err(|_| InvalidInputError)? as usize;
812                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
813                self.r = self.r.get(len..).unwrap();
814                Token::Str(ret)
815            }
816            rmp::Marker::Str32 => {
817                let len = self
818                    .r
819                    .read_u32::<BigEndian>()
820                    .map_err(|_| InvalidInputError)? as usize;
821                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
822                self.r = self.r.get(len..).unwrap();
823                Token::Str(ret)
824            }
825            rmp::Marker::Bin8 => {
826                let len = self.r.read_u8().map_err(|_| InvalidInputError)? as usize;
827                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
828                self.r = self.r.get(len..).unwrap();
829                Token::Bin(ret)
830            }
831            rmp::Marker::Bin16 => {
832                let len = self
833                    .r
834                    .read_u16::<BigEndian>()
835                    .map_err(|_| InvalidInputError)? as usize;
836                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
837                self.r = self.r.get(len..).unwrap();
838                Token::Bin(ret)
839            }
840            rmp::Marker::Bin32 => {
841                let len = self
842                    .r
843                    .read_u32::<BigEndian>()
844                    .map_err(|_| InvalidInputError)? as usize;
845                let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
846                self.r = self.r.get(len..).unwrap();
847                Token::Bin(ret)
848            }
849            rmp::Marker::FixArray(len) => Token::Array(len as u32),
850            rmp::Marker::Array16 => Token::Array(
851                self.r
852                    .read_u16::<BigEndian>()
853                    .map_err(|_| InvalidInputError)? as u32,
854            ),
855            rmp::Marker::Array32 => Token::Array(
856                self.r
857                    .read_u32::<BigEndian>()
858                    .map_err(|_| InvalidInputError)?,
859            ),
860            rmp::Marker::FixMap(len) => Token::Map(len as u32),
861            rmp::Marker::Map16 => Token::Map(
862                self.r
863                    .read_u16::<BigEndian>()
864                    .map_err(|_| InvalidInputError)? as u32,
865            ),
866            rmp::Marker::Map32 => Token::Map(
867                self.r
868                    .read_u32::<BigEndian>()
869                    .map_err(|_| InvalidInputError)?,
870            ),
871            rmp::Marker::FixExt1 => {
872                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
873                let data = self.r.get(0..1).ok_or(InvalidInputError)?;
874                self.r = self.r.get(1..).unwrap();
875                Token::Ext { tag, data }
876            }
877            rmp::Marker::FixExt2 => {
878                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
879                let data = self.r.get(0..2).ok_or(InvalidInputError)?;
880                self.r = self.r.get(2..).unwrap();
881                Token::Ext { tag, data }
882            }
883            rmp::Marker::FixExt4 => {
884                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
885                let data = self.r.get(0..4).ok_or(InvalidInputError)?;
886                self.r = self.r.get(4..).unwrap();
887                Token::Ext { tag, data }
888            }
889            rmp::Marker::FixExt8 => {
890                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
891                let data = self.r.get(0..8).ok_or(InvalidInputError)?;
892                self.r = self.r.get(8..).unwrap();
893                Token::Ext { tag, data }
894            }
895            rmp::Marker::FixExt16 => {
896                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
897                let data = self.r.get(0..16).ok_or(InvalidInputError)?;
898                self.r = self.r.get(16..).unwrap();
899                Token::Ext { tag, data }
900            }
901            rmp::Marker::Ext8 => {
902                let len = self.r.read_u8().map_err(|_| InvalidInputError)? as usize;
903                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
904                let data = self.r.get(0..len).ok_or(InvalidInputError)?;
905                self.r = self.r.get(len..).unwrap();
906                Token::Ext { tag, data }
907            }
908            rmp::Marker::Ext16 => {
909                let len = self
910                    .r
911                    .read_u16::<BigEndian>()
912                    .map_err(|_| InvalidInputError)? as usize;
913                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
914                let data = self.r.get(0..len).ok_or(InvalidInputError)?;
915                self.r = self.r.get(len..).unwrap();
916                Token::Ext { tag, data }
917            }
918            rmp::Marker::Ext32 => {
919                let len = self
920                    .r
921                    .read_u32::<BigEndian>()
922                    .map_err(|_| InvalidInputError)? as usize;
923                let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
924                let data = self.r.get(0..len).ok_or(InvalidInputError)?;
925                self.r = self.r.get(len..).unwrap();
926                Token::Ext { tag, data }
927            }
928            rmp::Marker::Reserved => return Err(InvalidInputError),
929        };
930        Ok(token)
931    }
932
933    /// Equivalent to `D::deserialize(self)`.
934    pub fn deserialize<D: Deserialize>(&mut self) -> Result<D, DeserializeError> {
935        D::deserialize(self)
936    }
937
938    /// Tries to deserialize an object of `D`.
939    /// If it succeeds it returns `Ok(Some(_))` and the internal state of `self` is changed.
940    /// If it fails with `ValidationError` it returns `Ok(None)` and the internal state of `self` is left unchanged.
941    /// If it fails with `InvalidInputError` it passes on the error.
942    pub fn try_deserialize<D: Deserialize>(&mut self) -> Result<Option<D>, InvalidInputError> {
943        let mut branch = *self;
944        match branch.deserialize() {
945            Ok(v) => {
946                *self = branch;
947                Ok(Some(v))
948            }
949            Err(DeserializeError::Validation(_)) => Ok(None),
950            Err(DeserializeError::InvalidInput(err)) => Err(err),
951        }
952    }
953
954    /// Read any single message pack object and discard it.
955    pub fn deserialize_any(&mut self) -> Result<(), DeserializeError> {
956        let mut count = 1;
957        while count > 0 {
958            count -= 1;
959            match self.deserialize_token()? {
960                Token::Nil
961                | Token::Bool(_)
962                | Token::Int(_)
963                | Token::F32(_)
964                | Token::F64(_)
965                | Token::Str(_)
966                | Token::Bin(_)
967                | Token::Ext { .. } => {}
968                Token::Array(len) => {
969                    count += len;
970                }
971                Token::Map(len) => {
972                    count += len * 2;
973                }
974            }
975        }
976        Ok(())
977    }
978}
979
980/// This error type represents type mismatch errors during deserialization.
981#[derive(Debug, Error)]
982#[error("validation failed")]
983pub struct ValidationError;
984
985/// This error type represents all possible errors during deserialization.
986#[derive(Debug, Error)]
987pub enum DeserializeError {
988    #[error(transparent)]
989    InvalidInput(#[from] InvalidInputError),
990    #[error(transparent)]
991    Validation(#[from] ValidationError),
992}
993
994pub trait Deserialize: Sized {
995    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError>;
996}
997
998impl Deserialize for bool {
999    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1000        if let Token::Bool(v) = deserializer.deserialize_token()? {
1001            return Ok(v);
1002        }
1003        Err(ValidationError.into())
1004    }
1005}
1006
1007impl Deserialize for Int {
1008    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1009        if let Token::Int(v) = deserializer.deserialize_token()? {
1010            return Ok(v);
1011        }
1012        Err(ValidationError.into())
1013    }
1014}
1015
1016impl Deserialize for u8 {
1017    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1018        deserializer
1019            .deserialize::<Int>()?
1020            .try_into()
1021            .map_err(|_| ValidationError.into())
1022    }
1023}
1024
1025impl Deserialize for u16 {
1026    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1027        deserializer
1028            .deserialize::<Int>()?
1029            .try_into()
1030            .map_err(|_| ValidationError.into())
1031    }
1032}
1033
1034impl Deserialize for u32 {
1035    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1036        deserializer
1037            .deserialize::<Int>()?
1038            .try_into()
1039            .map_err(|_| ValidationError.into())
1040    }
1041}
1042
1043impl Deserialize for u64 {
1044    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1045        deserializer
1046            .deserialize::<Int>()?
1047            .try_into()
1048            .map_err(|_| ValidationError.into())
1049    }
1050}
1051
1052impl Deserialize for i8 {
1053    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1054        deserializer
1055            .deserialize::<Int>()?
1056            .try_into()
1057            .map_err(|_| ValidationError.into())
1058    }
1059}
1060
1061impl Deserialize for i16 {
1062    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1063        deserializer
1064            .deserialize::<Int>()?
1065            .try_into()
1066            .map_err(|_| ValidationError.into())
1067    }
1068}
1069
1070impl Deserialize for i32 {
1071    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1072        deserializer
1073            .deserialize::<Int>()?
1074            .try_into()
1075            .map_err(|_| ValidationError.into())
1076    }
1077}
1078
1079impl Deserialize for i64 {
1080    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1081        deserializer
1082            .deserialize::<Int>()?
1083            .try_into()
1084            .map_err(|_| ValidationError.into())
1085    }
1086}
1087
1088impl Deserialize for f32 {
1089    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1090        if let Token::F32(v) = deserializer.deserialize_token()? {
1091            return Ok(v);
1092        }
1093        Err(ValidationError.into())
1094    }
1095}
1096
1097impl Deserialize for f64 {
1098    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1099        if let Token::F64(v) = deserializer.deserialize_token()? {
1100            return Ok(v);
1101        }
1102        Err(ValidationError.into())
1103    }
1104}
1105
1106impl Deserialize for Str {
1107    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1108        if let Token::Str(v) = deserializer.deserialize_token()? {
1109            return Ok(Str(v.to_vec()));
1110        }
1111        Err(ValidationError.into())
1112    }
1113}
1114
1115impl Deserialize for String {
1116    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1117        let Str(data) = deserializer.deserialize()?;
1118        let v = String::from_utf8(data).map_err(|_| ValidationError)?;
1119        Ok(v)
1120    }
1121}
1122
1123impl<T: Deserialize> Deserialize for Vec<T> {
1124    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1125        if let Token::Array(len) = deserializer.deserialize_token()? {
1126            let mut vec = Vec::with_capacity(len as usize);
1127            for _ in 0..len {
1128                vec.push(deserializer.deserialize()?);
1129            }
1130            return Ok(vec);
1131        }
1132        Err(ValidationError.into())
1133    }
1134}
1135
1136impl<T: Deserialize> Deserialize for Box<T> {
1137    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1138        Ok(Box::new(deserializer.deserialize()?))
1139    }
1140}
1141
1142impl<T: Deserialize> Deserialize for std::rc::Rc<T> {
1143    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1144        Ok(Self::new(deserializer.deserialize()?))
1145    }
1146}
1147
1148impl<T: Deserialize> Deserialize for std::sync::Arc<T> {
1149    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1150        Ok(Self::new(deserializer.deserialize()?))
1151    }
1152}
1153
1154/// Write out a MessagePack object.
1155pub fn serialize<S: Serialize>(s: S) -> Vec<u8> {
1156    let mut serializer = Serializer::new();
1157    serializer.serialize(s);
1158    serializer.into_inner()
1159}
1160
1161/// Write a MessagePack object into the given buffer.
1162///
1163/// This function does not modify the data originally in [buf].
1164pub fn serialize_into<S: Serialize>(s: S, buf: &mut Vec<u8>) {
1165    let v = std::mem::take(buf);
1166    let mut serializer = Serializer::with_vec(v);
1167    serializer.serialize(s);
1168    *buf = serializer.into_inner();
1169}
1170
1171/// Read out a MessagePack object.
1172///
1173/// If the input contains extra bytes following a valid msgpack object,
1174/// this function silently ignores them.
1175pub fn deserialize<D: Deserialize>(r: &[u8]) -> Result<D, DeserializeError> {
1176    let mut deserializer = Deserializer::new(r);
1177    deserializer.deserialize()
1178}
1179
1180#[test]
1181fn deserialize_ignores_extra_bytes() {
1182    let input: Vec<u8> = vec![0x01, 0xc1];
1183    let v: Int = deserialize(&input).unwrap();
1184    assert_eq!(v, Int::from(1u32));
1185}
1186
1187impl Serialize for Value {
1188    fn serialize(&self, serializer: &mut Serializer) {
1189        match self {
1190            Value::Nil => serializer.serialize_nil(),
1191            Value::Bool(v) => serializer.serialize_bool(*v),
1192            Value::Int(v) => serializer.serialize_int(*v),
1193            Value::F32(v) => serializer.serialize_f32(*v),
1194            Value::F64(v) => serializer.serialize_f64(*v),
1195            Value::Str(v) => serializer.serialize_str(&v.0),
1196            Value::Bin(v) => serializer.serialize_bin(&v.0),
1197            Value::Array(v) => {
1198                serializer.serialize_array(v.len() as u32);
1199                for x in v {
1200                    serializer.serialize(x);
1201                }
1202            }
1203            Value::Map(v) => {
1204                serializer.serialize_map(v.len() as u32);
1205                for (k, v) in v {
1206                    serializer.serialize(k);
1207                    serializer.serialize(v);
1208                }
1209            }
1210            Value::Ext(v) => serializer.serialize_ext(v.r#type, &v.data),
1211        }
1212    }
1213}
1214
1215impl Deserialize for Value {
1216    fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1217        let x = match deserializer.deserialize_token()? {
1218            Token::Nil => Value::Nil,
1219            Token::Bool(v) => v.into(),
1220            Token::Int(v) => v.into(),
1221            Token::F32(v) => v.into(),
1222            Token::F64(v) => v.into(),
1223            Token::Str(v) => Str(v.to_vec()).into(),
1224            Token::Bin(v) => Bin(v.to_vec()).into(),
1225            Token::Array(len) => {
1226                let mut vec: Vec<Value> = vec![];
1227                for _ in 0..len {
1228                    vec.push(deserializer.deserialize()?);
1229                }
1230                vec.into()
1231            }
1232            Token::Map(len) => {
1233                let mut map: Vec<(Value, Value)> = vec![];
1234                for _ in 0..len {
1235                    map.push((deserializer.deserialize()?, deserializer.deserialize()?));
1236                }
1237                map.into()
1238            }
1239            Token::Ext { tag, data } => Ext {
1240                r#type: tag,
1241                data: data.to_vec(),
1242            }
1243            .into(),
1244        };
1245        Ok(x)
1246    }
1247}
1248
1249// for backward compatibility
1250#[doc(hidden)]
1251pub mod value {
1252    use super::*;
1253
1254    pub use msgpack_value::{Bin, Ext, Int, Str, Value};
1255
1256    /// A special type for serializing and deserializing the `nil` object.
1257    ///
1258    /// In our data model `()` does not represent the `nil` object because `()` should be zero-byte but `nil` has a size.
1259    /// When you want to serialize or deserialize `nil` use this type instead.
1260    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
1261    pub struct Nil;
1262
1263    impl Serialize for Nil {
1264        fn serialize(&self, serializer: &mut Serializer) {
1265            serializer.serialize_nil()
1266        }
1267    }
1268
1269    impl Deserialize for Nil {
1270        fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1271            let token = deserializer.deserialize_token()?;
1272            if token != Token::Nil {
1273                return Err(ValidationError.into());
1274            }
1275            Ok(Self)
1276        }
1277    }
1278
1279    /// A special type used to deserialize any object and discard it.
1280    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
1281    pub struct Any;
1282
1283    impl Deserialize for Any {
1284        fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1285            deserializer.deserialize_any()?;
1286            Ok(Any)
1287        }
1288    }
1289
1290    /// A special type used to serialize and deserialize the empty map.
1291    #[derive(Debug, Clone, Copy, PartialEq, Eq)]
1292    pub struct Empty {}
1293
1294    impl Serialize for Empty {
1295        fn serialize(&self, serializer: &mut Serializer) {
1296            serializer.serialize_map(0)
1297        }
1298    }
1299
1300    impl Deserialize for Empty {
1301        fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1302            let token = deserializer.deserialize_token()?;
1303            if token != Token::Map(0) {
1304                return Err(ValidationError.into());
1305            }
1306            Ok(Self {})
1307        }
1308    }
1309}
1310
1311#[cfg(test)]
1312mod tests {
1313    use super::*;
1314    use msgpack_value::msgpack;
1315    use proptest::prelude::*;
1316    use proptest_derive::Arbitrary;
1317
1318    macro_rules! roundtrip {
1319        ($name:ident, $ty:ty) => {
1320            #[cfg(test)]
1321            mod $name {
1322                use super::*;
1323                proptest! {
1324                    #[test]
1325                    fn test(v: $ty) {
1326                        assert_eq!(v, deserialize::<$ty>(serialize(&v).as_slice()).unwrap());
1327                    }
1328                }
1329            }
1330        };
1331    }
1332
1333    roundtrip!(roundtrip_bool, bool);
1334    roundtrip!(roundtrip_i8, i8);
1335    roundtrip!(roundtrip_i16, i16);
1336    roundtrip!(roundtrip_i32, i32);
1337    roundtrip!(roundtrip_i64, i64);
1338    roundtrip!(roundtrip_u8, u8);
1339    roundtrip!(roundtrip_u16, u16);
1340    roundtrip!(roundtrip_u32, u32);
1341    roundtrip!(roundtrip_u64, u64);
1342    roundtrip!(roundtrip_f32, f32);
1343    roundtrip!(roundtrip_f64, f64);
1344    roundtrip!(roundtrip_str, String);
1345    roundtrip!(roundtrip_blob, Vec<i32>);
1346    roundtrip!(roundtrip_box, Box<i32>);
1347    roundtrip!(roundtrip_rc, std::rc::Rc<i32>);
1348    roundtrip!(roundtrip_arc, std::sync::Arc<i32>);
1349
1350    roundtrip!(roundtrip_value, Value);
1351    roundtrip!(roundtrip_int, Int);
1352
1353    #[derive(Debug, PartialEq, Eq, Arbitrary)]
1354    struct Human {
1355        age: u32,
1356        name: String,
1357    }
1358
1359    impl Serialize for Human {
1360        fn serialize(&self, serializer: &mut Serializer) {
1361            serializer.serialize_map(2);
1362            serializer.serialize(0u32);
1363            serializer.serialize(self.age);
1364            serializer.serialize(1u32);
1365            serializer.serialize(&self.name);
1366        }
1367    }
1368
1369    impl Deserialize for Human {
1370        fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1371            let len = match deserializer.deserialize_token()? {
1372                Token::Map(len) => len,
1373                _ => return Err(ValidationError.into()),
1374            };
1375
1376            let mut age: Option<u32> = None;
1377            let mut name: Option<String> = None;
1378            for _ in 0..len {
1379                let tag: u32 = deserializer.deserialize()?;
1380                match tag {
1381                    0 => {
1382                        if age.is_some() {
1383                            return Err(InvalidInputError.into());
1384                        }
1385                        age = Some(deserializer.deserialize()?);
1386                    }
1387                    1 => {
1388                        if name.is_some() {
1389                            return Err(InvalidInputError.into());
1390                        }
1391                        name = Some(deserializer.deserialize()?);
1392                    }
1393                    _ => {
1394                        deserializer.deserialize_any()?;
1395                    }
1396                }
1397            }
1398            Ok(Self {
1399                age: age.ok_or(ValidationError)?,
1400                name: name.ok_or(ValidationError)?,
1401            })
1402        }
1403    }
1404
1405    roundtrip!(roundtrip_human, Human);
1406
1407    fn check_serialize_result<T: Serialize>(x: T, v: Value) {
1408        let buf1 = serialize(&x);
1409        let buf2 = serialize(v);
1410        assert_eq!(buf1, buf2);
1411    }
1412
1413    #[test]
1414    fn struct_vs_value() {
1415        check_serialize_result(
1416            Human {
1417                age: 42,
1418                name: "John".into(),
1419            },
1420            msgpack!({
1421                0: 42,
1422                1: "John",
1423            }),
1424        );
1425    }
1426
1427    #[test]
1428    fn box_vs_value() {
1429        check_serialize_result(Box::new(42i32), msgpack!(42));
1430    }
1431
1432    #[test]
1433    fn rc_vs_value() {
1434        check_serialize_result(std::rc::Rc::new(42i32), msgpack!(42));
1435    }
1436
1437    #[test]
1438    fn arc_vs_value() {
1439        check_serialize_result(std::sync::Arc::new(42i32), msgpack!(42));
1440    }
1441
1442    #[test]
1443    fn serialize_into_keeps_buf() {
1444        let mut buf = vec![0x12, 0x34, 0x56, 0x78];
1445        serialize_into(42, &mut buf);
1446        assert_eq!(*buf, [0x12, 0x34, 0x56, 0x78, 42]);
1447    }
1448}