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}