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}