Skip to main content

json/
json.rs

1extern crate utf_railroad;
2
3use utf_railroad::{Diagram, Choice, Terminal, Sequence, Repeat, Optional, NonTerminal};
4
5fn main() {
6    let object = Diagram::default()
7        .push(Box::new(Terminal::new("{")))
8        .push(Box::new(
9            Optional::new(Box::new(
10                Sequence::default()
11                    .push(Box::new(
12                        Repeat::new(Box::new(
13                            Sequence::default()
14                                .push(Box::new(NonTerminal::new("string")))
15                                .push(Box::new(Terminal::new(":")))
16                                .push(Box::new(NonTerminal::new("value")))
17                                .push(Box::new(Terminal::new(",")))
18                        ))
19                    ))
20                    .push(Box::new(
21                        Sequence::default()
22                            .push(Box::new(NonTerminal::new("string")))
23                            .push(Box::new(Terminal::new(":")))
24                            .push(Box::new(NonTerminal::new("value")))
25                    ))
26            ))
27        ))
28        .push(Box::new(Terminal::new("}")));
29    println!("object:\n{}\n", object);
30
31    let array = Diagram::default()
32        .push(Box::new(Terminal::new("[")))
33        .push(Box::new(
34            Optional::new(Box::new(
35                Sequence::default()
36                    .push(Box::new(
37                        Repeat::new(Box::new(
38                            Sequence::default()
39                                .push(Box::new(NonTerminal::new("value")))
40                                .push(Box::new(Terminal::new(",")))
41                        ))
42                    ))
43                    .push(Box::new(NonTerminal::new("value")))
44            ))
45        ))
46        .push(Box::new(Terminal::new("]")));
47    println!("array:\n{}\n", array);
48
49    let value = Diagram::default()
50        .push(Box::new(
51            Choice::default()
52                .push(Box::new(NonTerminal::new("string")))
53                .push(Box::new(NonTerminal::new("number")))
54                .push(Box::new(NonTerminal::new("object")))
55                .push(Box::new(NonTerminal::new("array")))
56                .push(Box::new(Terminal::new("true")))
57                .push(Box::new(Terminal::new("false")))
58                .push(Box::new(Terminal::new("null")))
59        ));
60    println!("value:\n{}\n", value);
61
62    let string = Diagram::default()
63        .push(Box::new(Terminal::new("\"")))
64        .push(Box::new(
65            Repeat::new(Box::new(
66                Choice::default()
67                    .push(Box::new(Terminal::new("Any unicode character except \" or \\ or control character")))
68                    .push(Box::new(
69                        Sequence::default()
70                            .push(Box::new(Terminal::new("\\")))
71                            .push(Box::new(
72                                Choice::default()
73                                    .push(Box::new(Terminal::new("\"")))
74                                    .push(Box::new(Terminal::new("\\")))
75                                    .push(Box::new(Terminal::new("/")))
76                                    .push(Box::new(Terminal::new("b")))
77                                    .push(Box::new(Terminal::new("f")))
78                                    .push(Box::new(Terminal::new("n")))
79                                    .push(Box::new(Terminal::new("r")))
80                                    .push(Box::new(Terminal::new("t")))
81                                    .push(Box::new(
82                                        Sequence::default()
83                                            .push(Box::new(Terminal::new("u")))
84                                            .push(Box::new(
85                                                Repeat::new(Box::new(Terminal::new("hexadecimal digit")))
86                                                    .min(4)
87                                                    .max(4)
88                                            ))
89                                    ))
90                            ))
91                    ))
92                ))
93        ))
94        .push(Box::new(Terminal::new("\"")));
95    println!("string:\n{}\n", string);
96
97    let number = Diagram::default()
98        .push(Box::new(Optional::new(Box::new(Terminal::new("-")))))
99        .push(Box::new(
100            Choice::default()
101                .push(Box::new(Terminal::new("0")))
102                .push(Box::new(
103                    Sequence::default()
104                        .push(Box::new(Terminal::new("digit 1-9")))
105                        .push(Box::new(
106                            Repeat::new(Box::new(Terminal::new("digit")))
107                        ))
108                ))
109        ))
110        .push(Box::new(
111            Optional::new(Box::new(
112                Sequence::default()
113                    .push(Box::new(Terminal::new(".")))
114                    .push(Box::new(
115                        Repeat::new(Box::new(Terminal::new("digit")))
116                            .min(1)
117                    ))
118            ))
119        ))
120        .push(Box::new(
121            Optional::new(Box::new(
122                Sequence::default()
123                    .push(Box::new(
124                        Choice::default()
125                            .push(Box::new(Terminal::new("e")))
126                            .push(Box::new(Terminal::new("E")))
127                    ))
128                    .push(Box::new(
129                        Optional::new(Box::new(
130                            Choice::default()
131                                .push(Box::new(Terminal::new("+")))
132                                .push(Box::new(Terminal::new("-")))
133                        ))
134                    ))
135                    
136                    .push(Box::new(
137                        Repeat::new(Box::new(Terminal::new("digit")))
138                            .min(1)
139                    ))
140            ))
141        ));
142    println!("number:\n{}", number);
143}