1use super::CollectOptions;
2use super::ParseOptions;
3use super::errors::ParseError;
4use super::parse_to_ast;
5
6pub fn parse_to_serde_value(text: &str, parse_options: &ParseOptions) -> Result<Option<serde_json::Value>, ParseError> {
25 let value = parse_to_ast(
26 text,
27 &CollectOptions {
28 comments: crate::CommentCollectionStrategy::Off,
29 tokens: false,
30 },
31 parse_options,
32 )?
33 .value;
34 Ok(value.map(|v| v.into()))
35}
36
37#[cfg(test)]
38mod tests {
39 use pretty_assertions::assert_eq;
40 use serde_json::Value as SerdeValue;
41 use std::str::FromStr;
42
43 use super::*;
44
45 #[test]
46 fn it_should_error_when_has_error() {
47 assert_has_error(
48 "[][]",
49 "Text cannot contain more than one JSON value on line 1 column 3",
50 );
51 }
52
53 fn assert_has_error(text: &str, message: &str) {
54 let result = parse_to_serde_value(text, &Default::default());
55 match result {
56 Ok(_) => panic!("Expected error, but did not find one."),
57 Err(err) => assert_eq!(err.to_string(), message),
58 }
59 }
60
61 #[test]
62 fn it_should_parse_to_serde_value() {
63 let result = parse_to_serde_value(
64 r#"{ "a": { "a1": 5 }, "b": [0.3e+025], "c": "c1", "d": true, "e": false, "f": null }"#,
65 &Default::default(),
66 )
67 .unwrap();
68
69 let mut expected_value = serde_json::map::Map::new();
70 expected_value.insert("a".to_string(), {
71 let mut inner_obj = serde_json::map::Map::new();
72 inner_obj.insert(
73 "a1".to_string(),
74 SerdeValue::Number(serde_json::Number::from_str("5").unwrap()),
75 );
76 SerdeValue::Object(inner_obj)
77 });
78 expected_value.insert("b".to_string(), {
79 let mut inner_array = Vec::new();
80 inner_array.push(SerdeValue::Number(serde_json::Number::from_str("0.3e+025").unwrap()));
81 SerdeValue::Array(inner_array)
82 });
83 expected_value.insert("c".to_string(), SerdeValue::String("c1".to_string()));
84 expected_value.insert("d".to_string(), SerdeValue::Bool(true));
85 expected_value.insert("e".to_string(), SerdeValue::Bool(false));
86 expected_value.insert("f".to_string(), SerdeValue::Null);
87
88 assert_eq!(result, Some(SerdeValue::Object(expected_value)));
89 }
90
91 #[test]
92 fn it_should_parse_hexadecimal_numbers_to_decimal() {
93 let result = parse_to_serde_value(
94 r#"{
95 "hex1": 0x7DF,
96 "hex2": 0xFF,
97 "hex3": 0x10
98 }"#,
99 &Default::default(),
100 )
101 .unwrap();
102
103 let mut expected_value = serde_json::map::Map::new();
104 expected_value.insert("hex1".to_string(), SerdeValue::Number(serde_json::Number::from(2015)));
105 expected_value.insert("hex2".to_string(), SerdeValue::Number(serde_json::Number::from(255)));
106 expected_value.insert("hex3".to_string(), SerdeValue::Number(serde_json::Number::from(16)));
107
108 assert_eq!(result, Some(SerdeValue::Object(expected_value)));
109 }
110
111 #[test]
112 fn it_should_parse_unary_plus_numbers() {
113 let result = parse_to_serde_value(
114 r#"{
115 "pos1": +42,
116 "pos2": +0.5,
117 "pos3": +1e10
118 }"#,
119 &Default::default(),
120 )
121 .unwrap();
122
123 let mut expected_value = serde_json::map::Map::new();
124 expected_value.insert("pos1".to_string(), SerdeValue::Number(serde_json::Number::from(42)));
125 expected_value.insert(
126 "pos2".to_string(),
127 SerdeValue::Number(serde_json::Number::from_str("0.5").unwrap()),
128 );
129 expected_value.insert(
130 "pos3".to_string(),
131 SerdeValue::Number(serde_json::Number::from_str("1e10").unwrap()),
132 );
133
134 assert_eq!(result, Some(SerdeValue::Object(expected_value)));
135 }
136}