1use super::errors::ParseError;
2use super::parse_to_ast;
3use super::CollectOptions;
4use super::ParseOptions;
5
6pub fn parse_to_serde_value(text: &str, parse_options: &ParseOptions) -> Result<Option<serde_json::Value>, ParseError> {
22 let value = parse_to_ast(
23 text,
24 &CollectOptions {
25 comments: crate::CommentCollectionStrategy::Off,
26 tokens: false,
27 },
28 parse_options,
29 )?
30 .value;
31 Ok(value.map(|v| v.into()))
32}
33
34#[cfg(test)]
35mod tests {
36 use pretty_assertions::assert_eq;
37 use serde_json::Value as SerdeValue;
38 use std::str::FromStr;
39
40 use super::*;
41
42 #[test]
43 fn it_should_error_when_has_error() {
44 assert_has_error(
45 "[][]",
46 "Text cannot contain more than one JSON value on line 1 column 3",
47 );
48 }
49
50 fn assert_has_error(text: &str, message: &str) {
51 let result = parse_to_serde_value(text, &Default::default());
52 match result {
53 Ok(_) => panic!("Expected error, but did not find one."),
54 Err(err) => assert_eq!(err.to_string(), message),
55 }
56 }
57
58 #[test]
59 fn it_should_parse_to_serde_value() {
60 let result = parse_to_serde_value(
61 r#"{ "a": { "a1": 5 }, "b": [0.3e+025], "c": "c1", "d": true, "e": false, "f": null }"#,
62 &Default::default(),
63 )
64 .unwrap();
65
66 let mut expected_value = serde_json::map::Map::new();
67 expected_value.insert("a".to_string(), {
68 let mut inner_obj = serde_json::map::Map::new();
69 inner_obj.insert(
70 "a1".to_string(),
71 SerdeValue::Number(serde_json::Number::from_str("5").unwrap()),
72 );
73 SerdeValue::Object(inner_obj)
74 });
75 expected_value.insert("b".to_string(), {
76 let mut inner_array = Vec::new();
77 inner_array.push(SerdeValue::Number(serde_json::Number::from_str("0.3e+025").unwrap()));
78 SerdeValue::Array(inner_array)
79 });
80 expected_value.insert("c".to_string(), SerdeValue::String("c1".to_string()));
81 expected_value.insert("d".to_string(), SerdeValue::Bool(true));
82 expected_value.insert("e".to_string(), SerdeValue::Bool(false));
83 expected_value.insert("f".to_string(), SerdeValue::Null);
84
85 assert_eq!(result, Some(SerdeValue::Object(expected_value)));
86 }
87}