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
148
149
150
151
152
153
154
155
156
//! # jsonc-parser
//!
//! A JSON parser and manipulator that supports comments and other JSON extensions.
//!
//! ## Parsing
//!
//! To a simple `JsonValue`:
//!
//! ```
//! use jsonc_parser::parse_to_value;
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let json_value = parse_to_value(r#"{ "test": 5 } // test"#, &Default::default())?;
//! // check the json_value here
//! # Ok(())
//! # }
//! ```
//!
//! Or an AST:
//!
//! ```
//! use jsonc_parser::parse_to_ast;
//! use jsonc_parser::CollectOptions;
//! use jsonc_parser::CommentCollectionStrategy;
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! let parse_result = parse_to_ast(r#"{ "test": 5 } // test"#, &CollectOptions {
//! comments: CommentCollectionStrategy::Separate, // include comments in result
//! tokens: true, // include tokens in result
//! }, &Default::default())?;
//! // ...inspect parse_result for value, tokens, and comments here...
//! # Ok(())
//! # }
//! ```
//!
//! ## Manipulation (CST)
//!
//! When enabling the `cst` cargo feature, parsing to a CST provides a first class manipulation API:
//!
//! ```
//! # #[cfg(feature = "cst")]
//! # {
//! use jsonc_parser::cst::CstRootNode;
//! use jsonc_parser::ParseOptions;
//! use jsonc_parser::json;
//!
//! let json_text = r#"{
//! // comment
//! "data": 123
//! }"#;
//!
//! let root = CstRootNode::parse(json_text, &ParseOptions::default()).unwrap();
//! let root_obj = root.object_value_or_set();
//!
//! root_obj.get("data").unwrap().set_value(json!({
//! "nested": true
//! }));
//! root_obj.append("new_key", json!([456, 789, false]));
//!
//! assert_eq!(root.to_string(), r#"{
//! // comment
//! "data": {
//! "nested": true
//! },
//! "new_key": [456, 789, false]
//! }"#);
//! # }
//! ```
//!
//! ## Serde
//!
//! If you enable the `"serde"` feature as follows:
//!
//! ```toml
//! # in Cargo.toml
//! jsonc-parser = { version = "...", features = ["serde"] }
//! ```
//!
//! Then you can use the `parse_to_serde_value` function to deserialize JSONC directly into
//! any type implementing `serde::Deserialize`:
//!
//! ```
//! # #[cfg(feature = "serde")]
//! # {
//! use jsonc_parser::parse_to_serde_value;
//!
//! #[derive(serde::Deserialize)]
//! struct Config {
//! test: u32,
//! }
//!
//! # fn parse_example() -> Result<(), Box<dyn std::error::Error>> {
//! let config: Config = parse_to_serde_value(r#"{ "test": 5 } // test"#, &Default::default())?;
//! # Ok(())
//! # }
//! # }
//! ```
//!
//! ## Parse Strictly as JSON
//!
//! By default this library is extremely loose in what it allows parsing. To be strict,
//! provide `ParseOptions` and set all the options to false:
//!
//! ```
//! use jsonc_parser::parse_to_value;
//! use jsonc_parser::ParseOptions;
//!
//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
//! # let text = "{}";
//! let json_value = parse_to_value(text, &ParseOptions {
//! allow_comments: false,
//! allow_loose_object_property_names: false,
//! allow_trailing_commas: false,
//! allow_missing_commas: false,
//! allow_single_quoted_strings: false,
//! allow_hexadecimal_numbers: false,
//! allow_unary_plus_numbers: false,
//! })?;
//! # Ok(())
//! # }
//! ```
//!
//! ## Error column number with unicode-width
//!
//! To get more accurate display column numbers in error messages, enable the `error_unicode_width` cargo feature,
//! which will pull in and use the [unicode-width](https://crates.io/crates/unicode-width) dependency internally.
//! Otherwise it will use the character count, which isn't as accurate of a number, but will probably be good enough
//! in most cases.
pub use *;
pub use *;
pub use *;
pub use ParseStringErrorKind;
pub use *;
pub use *;