jp_rs/
slow_parse.rs

1use pa_rs::slow_parser::*;
2use crate::json::JSONValue::{self, *};
3
4pub fn parse_json() -> Parser<JSONValue> {
5  parse_one_of([
6      parse_json_object(),
7      parse_json_array(),
8      parse_json_string(),
9      parse_json_number(),
10      parse_json_bool(),
11      parse_json_null(),
12  ])
13}
14
15fn parse_json_null() -> Parser<JSONValue> {
16  parse_str("null").map(|_| JSONNull)
17}
18
19fn parse_json_bool() -> Parser<JSONValue> {
20  parse_bool().map(|x| JSONBool(x))
21}
22
23fn parse_json_number() -> Parser<JSONValue> {
24  parse_float().map(|x| JSONNumber(x))
25}
26
27fn parse_json_string() -> Parser<JSONValue> {
28  parse_string().map(|x| JSONString(x))
29}
30
31fn parse_json_array() -> Parser<JSONValue> {
32  Parser::new(|input| parse_list_of(|| parse_json())._run(input)).map(|v| JSONArray(v))
33}
34
35fn parse_json_object() -> Parser<JSONValue> {
36  let parse_kv = || parse_sbws(parse_string()) << parse_char(':') & parse_sbws(parse_json());
37  parse_char('{')
38      >> parse_one_of([
39          Parser::new(move |input| {
40              (parse_zero_or_more(parse_kv() << parse_char(',')) & parse_kv())
41                  .map(|(mut v, a)| {
42                      v.push(a);
43                      JSONObject(v)
44                  })
45                  ._run(input)
46          }),
47          parse_white_space().map(|_| JSONObject(vec![])),
48      ])
49      << parse_char('}')
50}