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
142
143
144
145
146
147
//! JSON support for [Müsli] suitable for network and usually browser
//! communication.
//!
//! JSON encoding is fully upgrade stable:
//!
//! * ✔ Can tolerate missing fields if they are annotated with
//! `#[musli(default)]`.
//! * ✔ Can skip over unknown fields.
//!
//! [Müsli]: https://github.com/udoprog/musli
//!
//! ```
//! 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::json::to_vec(&Version2 {
//! name: String::from("Aristotle"),
//! age: Some(61),
//! })?;
//!
//! let version1: Version1 = musli::json::from_slice(version2.as_slice())?;
//!
//! assert_eq!(version1, Version1 {
//! name: String::from("Aristotle"),
//! });
//! # Ok::<_, musli::json::Error>(())
//! ```
//!
//! <br>
//!
//! ## Pretty printing
//!
//! Encoding signals the structure of the document it is writing to the
//! [`Writer`] it is using through methods such as [`Writer::begin_object`] and
//! [`Writer::begin_array_element`]. These default to doing nothing, which is
//! what a compact document wants. Give an [`Encoding`] a [`Pretty`]
//! configuration and it wraps its output in a writer which uses those signals
//! to insert newlines and indentation instead:
//!
//! ```
//! use musli::Encode;
//! use musli::json::{Encoding, Pretty};
//!
//! #[derive(Encode)]
//! struct Person {
//! name: String,
//! age: u32,
//! }
//!
//! const PRETTY: Encoding = Encoding::new().with_pretty(Pretty::new());
//!
//! let person = Person {
//! name: String::from("Aristotle"),
//! age: 61,
//! };
//!
//! assert_eq!(PRETTY.to_string(&person)?, r#"{
//! "name": "Aristotle",
//! "age": 61
//! }"#);
//! # Ok::<_, musli::json::Error>(())
//! ```
//!
//! The [`to_string_pretty`], [`to_vec_pretty`], [`to_slice_pretty`], and
//! [`to_writer_pretty`] functions are shorthands for doing the same with the
//! default [`Encoding`].
//!
//! [`Writer::begin_array_element`]: crate::Writer::begin_array_element
//! [`Writer::begin_object`]: crate::Writer::begin_object
//! [`Writer`]: crate::Writer
/// Convenient result alias for use with `musli::json`.
///
/// # Examples
///
/// ```
/// use musli::json::{self, Result};
/// use musli::{Encode, Decode};
///
/// #[derive(Debug, PartialEq, Encode, Decode)]
/// struct Person {
/// name: String,
/// age: u32,
/// }
///
/// fn json_roundtrip(person: &Person) -> Result<Person> {
/// let json_string = json::to_string(person)?;
/// json::from_str(&json_string)
/// }
///
/// let original = Person {
/// name: "Alice".to_string(),
/// age: 30
/// };
/// let decoded = json_roundtrip(&original)?;
/// assert_eq!(original, decoded);
/// # Ok::<_, musli::json::Error>(())
/// ```
pub type Result<T, E = Error> = Result;
pub use Encoding;
pub use ;
pub use ;
pub use ;
pub use Error;
pub use Parser;
pub use Pretty;