Skip to main content

pick/formats/
json.rs

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}