1use crate::error::PickError;
2use serde_json::Value;
3
4pub fn parse(input: &str) -> Result<Value, PickError> {
5 serde_json::from_str(input).map_err(|e| PickError::ParseError("JSON".into(), e.to_string()))
6}
7
8#[cfg(test)]
9mod tests {
10 use super::*;
11 use serde_json::json;
12
13 #[test]
14 fn parse_object() {
15 let v = parse(r#"{"name": "Alice", "age": 30}"#).unwrap();
16 assert_eq!(v, json!({"name": "Alice", "age": 30}));
17 }
18
19 #[test]
20 fn parse_array() {
21 let v = parse("[1, 2, 3]").unwrap();
22 assert_eq!(v, json!([1, 2, 3]));
23 }
24
25 #[test]
26 fn parse_nested() {
27 let v = parse(r#"{"a": {"b": [1, {"c": true}]}}"#).unwrap();
28 assert_eq!(v["a"]["b"][1]["c"], json!(true));
29 }
30
31 #[test]
32 fn parse_unicode() {
33 let v = parse(r#"{"emoji": "hello 🌍"}"#).unwrap();
34 assert_eq!(v["emoji"], json!("hello 🌍"));
35 }
36
37 #[test]
38 fn parse_escaped() {
39 let v = parse(r#"{"path": "C:\\Users\\test"}"#).unwrap();
40 assert_eq!(v["path"], json!("C:\\Users\\test"));
41 }
42
43 #[test]
44 fn parse_null() {
45 let v = parse(r#"{"val": null}"#).unwrap();
46 assert_eq!(v["val"], Value::Null);
47 }
48
49 #[test]
50 fn parse_empty_object() {
51 let v = parse("{}").unwrap();
52 assert_eq!(v, json!({}));
53 }
54
55 #[test]
56 fn parse_empty_array() {
57 let v = parse("[]").unwrap();
58 assert_eq!(v, json!([]));
59 }
60
61 #[test]
62 fn parse_large_number() {
63 let v = parse(r#"{"big": 9999999999999999}"#).unwrap();
64 assert!(v["big"].is_number());
65 }
66
67 #[test]
68 fn parse_float() {
69 let v = parse(r#"{"pi": 3.14159}"#).unwrap();
70 assert_eq!(v["pi"], json!(3.14159));
71 }
72
73 #[test]
74 fn parse_invalid() {
75 assert!(parse("not json").is_err());
76 }
77
78 #[test]
79 fn parse_scalar_string() {
80 let v = parse(r#""hello""#).unwrap();
81 assert_eq!(v, json!("hello"));
82 }
83
84 #[test]
85 fn parse_scalar_number() {
86 let v = parse("42").unwrap();
87 assert_eq!(v, json!(42));
88 }
89}