jp_rs/
lib.rs

1mod json;
2mod slow_parse;
3mod parse;
4
5pub use json::JSONValue::{self, *};
6pub use slow_parse::*;
7pub use parse::*;
8
9#[cfg(test)]
10mod tests {
11    use super::*;
12    use pa_rs::parser::Parse;
13
14    #[test]
15    fn test_parse_json() {
16        let raw_json = "\
17        {\
18            \"squadName\": \"Super hero squad\",\
19            \"homeTown\": \"Metro City\",\
20            \"formed\": 2016,\
21            \"secretBase\": \"Super tower\",\
22            \"active\": true,\
23            \"members\": [\
24              {\
25                \"name\": \"Molecule Man\",\
26                \"age\": 29,\
27                \"secretIdentity\": \"Dan Jukes\",\
28                \"powers\": [\"Radiation resistance\", \"Turning tiny\", \"Radiation blast\"]\
29              },\
30              {\
31                \"name\": \"Madame Uppercut\",\
32                \"age\": 39,\
33                \"secretIdentity\": \"Jane Wilson\",\
34                \"powers\": [\
35                  \"Million tonne punch\",\
36                  \"Damage resistance\",\
37                  \"Superhuman reflexes\"\
38                ]\
39              },\
40              {\
41                \"name\": \"Eternal Flame\",\
42                \"age\": 1000000,\
43                \"secretIdentity\": \"Unknown\",\
44                \"powers\": [\
45                  \"Immortality\",\
46                  \"Heat Immunity\",\
47                  \"Inferno\",\
48                  \"Teleportation\",\
49                  \"Interdimensional travel\"\
50                ]\
51              }\
52            ]\
53          }\
54        ";
55
56        let s = String::from;
57
58        let parsed_json = JSONObject(vec![
59            (s("squadName"), JSONString(s("Super hero squad"))),
60            (s("homeTown"), JSONString(s("Metro City"))),
61            (s("formed"), JSONNumber(2016.0)),
62            (s("secretBase"), JSONString(s("Super tower"))),
63            (s("active"), JSONBool(true)),
64            (
65                s("members"),
66                JSONArray(vec![
67                    JSONObject(vec![
68                        (s("name"), JSONString(s("Molecule Man"))),
69                        (s("age"), JSONNumber(29.0)),
70                        (s("secretIdentity"), JSONString(s("Dan Jukes"))),
71                        (
72                            s("powers"),
73                            JSONArray(vec![
74                                JSONString(s("Radiation resistance")),
75                                JSONString(s("Turning tiny")),
76                                JSONString(s("Radiation blast")),
77                            ]),
78                        ),
79                    ]),
80                    JSONObject(vec![
81                        (s("name"), JSONString(s("Madame Uppercut"))),
82                        (s("age"), JSONNumber(39.0)),
83                        (s("secretIdentity"), JSONString(s("Jane Wilson"))),
84                        (
85                            s("powers"),
86                            JSONArray(vec![
87                                JSONString(s("Million tonne punch")),
88                                JSONString(s("Damage resistance")),
89                                JSONString(s("Superhuman reflexes")),
90                            ]),
91                        ),
92                    ]),
93                    JSONObject(vec![
94                        (s("name"), JSONString(s("Eternal Flame"))),
95                        (s("age"), JSONNumber(1000000.0)),
96                        (s("secretIdentity"), JSONString(s("Unknown"))),
97                        (
98                            s("powers"),
99                            JSONArray(vec![
100                                JSONString(s("Immortality")),
101                                JSONString(s("Heat Immunity")),
102                                JSONString(s("Inferno")),
103                                JSONString(s("Teleportation")),
104                                JSONString(s("Interdimensional travel")),
105                            ]),
106                        ),
107                    ]),
108                ]),
109            ),
110        ]);
111
112        assert_eq!(parse_json().run(raw_json), Ok(parsed_json.clone()));
113        assert_eq!(JSONValueParser.run(raw_json), Ok(parsed_json));
114        
115        println!("{:?}", JSONValueParser.run(raw_json));
116    }
117}