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
//! A fully self-descriptive format for [Müsli].
//!
//! Descriptive encoding is fully upgrade stable:
//!
//! * ✔ Can tolerate missing fields if they are annotated with
//! `#[musli(default)]`.
//! * ✔ Can skip over unknown fields.
//! * ✔ Can be fully converted back and forth between dynamic containers such as
//! the [`Value`] type.
//! * ✔ Can handle coercion from different types of primitive types, such as
//! signed to unsigned integers. So primitive field types can be assuming they
//! only inhabit compatible values.
//!
//! [Müsli]: https://docs.rs/musli
//! [`Value`]: crate::value
//!
//! This means that it's suitable as a wire and general interchange format. It's
//! also suitable for dynamically translating to and from different wire formats
//! such as JSON without having access to the data model.
//!
//! ```
//! use musli::{Encode, Decode};
//!
//! #[derive(Debug, PartialEq, Encode, Decode)]
//! struct Version1 {
//! name: String,
//! }
//!
//! #[derive(Debug, PartialEq, Encode, Decode)]
//! struct Version2 {
//! name: String,
//! #[musli(default)]
//! age: Option<u32>,
//! }
//!
//! let version2 = musli::descriptive::to_vec(&Version2 {
//! name: String::from("Aristotle"),
//! age: Some(61),
//! })?;
//!
//! let version1: Version1 = musli::descriptive::decode(version2.as_slice())?;
//!
//! assert_eq!(version1, Version1 {
//! name: String::from("Aristotle"),
//! });
//! # Ok::<_, musli::descriptive::Error>(())
//! ```
//!
//! <br>
//!
//! ## Configuring
//!
//! To configure the behavior of the wire format you can use the [`Encoding`]
//! type:
//!
//! ```
//! use musli::{Encode, Decode};
//! use musli::descriptive::Encoding;
//!
//! const CONFIG: Encoding = Encoding::new();
//!
//! #[derive(Debug, PartialEq, Encode, Decode)]
//! struct Person<'a> {
//! name: &'a str,
//! age: u32,
//! }
//!
//! let mut out = Vec::new();
//!
//! let expected = Person {
//! name: "Aristotle",
//! age: 61,
//! };
//!
//! CONFIG.encode(&mut out, &expected)?;
//! let actual = CONFIG.decode(&out[..])?;
//!
//! assert_eq!(expected, actual);
//! # Ok::<_, musli::descriptive::Error>(())
//! ```
//!
//! <br>
//!
//! ## Implementation details
//!
//! Each field is prefix *typed* with a single byte tag that describes exactly
//! the type which is contained in the field.
/// Convenient result alias for use with `musli::descriptive`.
pub type Result<T, E = Error> = Result;
pub use to_vec;
pub use to_writer;
pub use ;
pub use ;
pub use Error;
/// The maximum length that can be inlined in the tag without adding additional
/// data to the wire format.
pub const MAX_INLINE_LEN: usize = as usize;