json/
json.rs

1extern crate honeycomb;
2use honeycomb::{
3    atoms::{rec, seq_no_ws},
4    language,
5    transform::{to_btree, to_number},
6    Parser,
7};
8
9use std::collections::BTreeMap;
10
11#[derive(Debug, Clone, PartialEq)]
12pub enum JsonValue {
13    Null,
14    Bool(bool),
15    Str(String),
16    Num(f64),
17    Array(Vec<JsonValue>),
18    Object(BTreeMap<String, JsonValue>),
19}
20
21fn boolean() -> Parser<JsonValue> {
22    (seq_no_ws("true") - |_| JsonValue::Bool(true))
23        | (seq_no_ws("false") - |_| JsonValue::Bool(false))
24}
25
26fn string() -> Parser<String> {
27    language::string()
28}
29
30fn number() -> Parser<JsonValue> {
31    language::number() - to_number - JsonValue::Num
32}
33
34fn null() -> Parser<JsonValue> {
35    seq_no_ws("null") - |_| JsonValue::Null
36}
37
38fn array() -> Parser<JsonValue> {
39    language::array("[", json(), "]") - JsonValue::Array
40}
41
42fn object() -> Parser<JsonValue> {
43    language::array("{", string() << seq_no_ws(":") & rec(json), "}") - to_btree - JsonValue::Object
44}
45
46fn json() -> Parser<JsonValue> {
47    null() | boolean() | number() | (string() - JsonValue::Str) | rec(array) | rec(object)
48}
49
50fn main() {
51    println!(
52        "{:#?}",
53        json().parse(
54            r#"
55{
56    "testing" : null,
57    "recursion" : {
58        "WOW": 1.2345
59    },
60    "array": [1, 2, {"test": "123"}, 4],
61    "test": "testing"
62}
63"#
64        )
65    );
66}