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
//! Parse [JSON5](https://json5.org/) compatible with deser.
//!
//! JSON5 extends JSON with syntax from ECMAScript 5.1:
//!
//! * `//` and `/* */` comments,
//! * commas after the last element of sequences and maps,
//! * map keys which are ECMAScript identifiers (`{name: "api"}`, with
//! Unicode letters and `\u` escapes),
//! * strings in single quotes, escaped line breaks within strings and the
//! escapes `\'`, `\v`, `\0` and `\xFF`,
//! * hexadecimal numbers (those that do not fit into 64 bits are 128 bit
//! integers and floats beyond that), numbers with a leading `+` or a
//! leading or trailing decimal point, `Infinity` and `NaN`,
//! * more whitespace characters.
//!
//! Otherwise this works like [`deser-json`](https://docs.rs/deser-json):
//! strings and identifiers without escape sequences are borrowed from the
//! input and the positions of errors and values refer to the input. In
//! [JSON Lines](Trailing::Newline) only line breaks outside of comments and
//! strings end a value. The parser passes the [JSON5 test
//! suite](https://github.com/json5/json5-tests).
//!
//! ```rust
//! #[derive(deser::Deserialize)]
//! struct Config<'a> {
//! name: &'a str,
//! ports: Vec<u16>,
//! timeout: f64,
//! }
//!
//! let config: Config = deser_json5::from_str(r#"{
//! // the name of the service
//! name: 'api',
//! ports: [0x50, 443,],
//! timeout: .5,
//! }"#).unwrap();
//! assert_eq!(config.name, "api");
//! assert_eq!(config.ports, [80, 443]);
//! assert_eq!(config.timeout, 0.5);
//! ```
//!
//! JSON is valid JSON5, so values are serialized as JSON with the
//! serializer of `deser-json` (which is re-exported). Unlike JSON, JSON5
//! can represent NaN and infinite floats: [`to_string`] and [`to_writer`]
//! write them as `NaN`, `Infinity` and `-Infinity` where `deser-json`
//! writes `null`. A [`SerializerConfig`] needs
//! [`set_non_finite_floats`](SerializerConfig::set_non_finite_floats) for this:
//!
//! ```rust
//! use deser_json5::{Indent, SerializerConfig};
//!
//! let values = vec![1.5, f64::NAN, f64::NEG_INFINITY];
//! assert_eq!(deser_json5::to_string(&values).unwrap(), "[1.5,NaN,-Infinity]");
//!
//! const PRETTY: SerializerConfig = SerializerConfig::builder()
//! .pretty(Indent::Spaces(2))
//! .non_finite_floats(true).build();
//! assert_eq!(
//! PRETTY.to_string(&values).unwrap(),
//! "[\n 1.5,\n NaN,\n -Infinity\n]"
//! );
//! ```
//!
//! # Raw Values
//!
//! [`RawJson5`] holds the JSON5 text of a value. Like `deser_json::RawJson` it
//! keeps the text of values that are deserialized from JSON5 as it is
//! (including comments), other values are encoded as JSON. See
//! [`Raw`](deser_core::ext::Raw) for more information.
//!
//! # Features
//!
//! * `io` (enabled by default): reading and writing streams of the
//! standard library (with `DeserializerConfig::reader`). Requires
//! `std`.
//! * `speedups` (enabled by default): faster UTF-8 validation.
//! * `std` (enabled by default): uses the standard library. Without it
//! this crate only needs `alloc` (see [`no_std`](https://docs.rs/deser/latest/deser/#no_std)).
extern crate alloc;
// These are generated from `deser-template-json`.
pub use ;
pub use ;
pub use StreamDeserializer;
pub use from_reader;
pub use ;
use String;
use ;
/// The configuration of [`to_string`] and [`to_writer`].
const SERIALIZER_CONFIG: SerializerConfig =
builder.non_finite_floats.build;
/// Serializes a value to JSON5.
///
/// The output is JSON, except for NaN and infinite floats which are
/// written as `NaN`, `Infinity` and `-Infinity`.
///
/// ```
/// let value = vec![1.0, f64::INFINITY];
/// assert_eq!(deser_json5::to_string(&value).unwrap(), "[1.0,Infinity]");
/// ```
Sized>
/// Serializes a value as JSON5 to a writer.
///
/// Like [`to_string`] the output is JSON except for NaN and infinite
/// floats. The output of large values is written in parts while they are
/// serialized (see `deser::io`), the writer does not need to be buffered.
///
/// ```
/// let mut out = Vec::new();
/// deser_json5::to_writer(&mut out, &vec![f64::NAN]).unwrap();
/// assert_eq!(out, b"[NaN]");
/// ```
Sized>