1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
//! # The Rust MessagePack Library
//!
//! RMP is a pure Rust [MessagePack](http://msgpack.org) implementation.
//!
//! MessagePack is an efficient binary serialization format.
//!
//! **Warning** this library is still in rapid development and everything may change until 1.0 comes.
//!
//! ## Usage
//!
//! To use `rmp`, first add this to your `Cargo.toml`:
//!
//! ```toml
//! [dependencies.rmp]
//! rmp = "0.5.0"
//! ```
//!
//! Then, add this to your crate root:
//!
//! ```rust
//! extern crate rmp as msgpack;
//! ```
//!
//! ## Features
//!
//! - **Convenient API**
//!
//! RMP is designed to be lightweight and straightforward. There are low-level API, which gives you
//! full control on data encoding/decoding process and makes no heap allocations. On the other hand
//! there are high-level API, which provides you convenient interface using Rust standard library and
//! compiler reflection, allowing to encode/decode structures using `derive` attribute.
//!
//! - **Clear error handling**
//!
//! RMP's error system guarantees that you never receive an error enum with unreachable variant.
//!
//! - **Robust and tested**
//!
//! This project is developed using TDD and CI, so any found bugs will be fixed without breaking
//! existing functionality.
//!
//! ## Examples
//!
//! Let's try to encode a tuple of int and string.
//!
//! ```rust
//! extern crate rmp as msgpack;
//! extern crate rustc_serialize;
//!
//! use rustc_serialize::Encodable;
//! use msgpack::Encoder;
//!
//! fn main() {
//! let val = (42u8, "the Answer");
//!
//! // The encoder borrows the bytearray buffer.
//! let mut buf = [0u8; 13];
//!
//! val.encode(&mut Encoder::new(&mut &mut buf[..]));
//!
//! assert_eq!([0x92, 0x2a, 0xaa, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72], buf);
//! }
//! ```
//!
//! Now we have an encoded buffer, which we can decode the same way:
//!
//! ```rust
//! extern crate rmp as msgpack;
//! extern crate rustc_serialize;
//!
//! use rustc_serialize::Decodable;
//! use msgpack::Decoder;
//!
//! fn main() {
//! let buf = [0x92, 0x2a, 0xaa, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72];
//!
//! let mut decoder = Decoder::new(&buf[..]);
//!
//! let res: (u8, String) = Decodable::decode(&mut decoder).unwrap();
//!
//! assert_eq!((42u8, "the Answer".to_string()), res);
//! }
//! ```
//!
//! RMP also allows to automatically serialize/deserialize custom structures using rustc_serialize
//! reflection. To enable this feature, derive RustcEncodable and RustcDecodable attributes as
//! shown in the following example:
//!
//! ```rust
//! extern crate rmp as msgpack;
//! extern crate rustc_serialize;
//!
//! use rustc_serialize::{Encodable, Decodable};
//! use msgpack::{Encoder, Decoder};
//!
//! #[derive(RustcEncodable, RustcDecodable, PartialEq, Debug)]
//! struct Custom {
//! id: u32,
//! key: String,
//! }
//!
//! fn main() {
//! let val = Custom { id: 42u32, key: "the Answer".to_string() };
//!
//! let mut buf = [0u8; 13];
//!
//! val.encode(&mut Encoder::new(&mut &mut buf[..]));
//!
//! assert_eq!([0x92, 0x2a, 0xaa, 0x74, 0x68, 0x65, 0x20, 0x41, 0x6e, 0x73, 0x77, 0x65, 0x72], buf);
//!
//! // Now try to unpack the buffer into the initial struct.
//! let mut decoder = Decoder::new(&buf[..]);
//! let res: Custom = Decodable::decode(&mut decoder).ok().unwrap();
//!
//! assert_eq!(val, res);
//! }
//! ```
//!
//! ## Limitations and plans
//!
//! - Non-owning `ValueRef` variant, which can be created from `[u8]`, `Cursor<[u8]>` etc. and
//! borrows data from it, which makes it absolute zero-copy.
extern crate byteorder;
extern crate rustc_serialize as serialize;
pub const MSGPACK_VERSION : u32 = 5;
pub use Decoder;
pub use Encoder;
pub use Marker;
pub use ;