1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#[derive(PartialEq,Debug)]
pub enum Elem<'a> {
Value(&'a [u8]),
List(Vec<Elem<'a>>)
}
pub fn parse<'a>(data: &'a [&'a [u8]]) -> Vec<Elem<'a>>
{
let mut base : Vec<Elem<'a>> = vec!{};
let mut list_stack : Vec<Vec<Elem<'a>>> = vec!{};
macro_rules! push {
($e:expr) => (
match list_stack.pop() {
Some(mut v) => {
v.push($e);
list_stack.push(v);
},
None => {
base.push($e);
}
}
);
}
for d in data {
match d {
&b"[" => list_stack.push(vec!{}),
&b"]" => match list_stack.pop() {
Some(l) => push!(Elem::List(l)),
None => return base,
},
v => push!(Elem::Value(v)),
}
}
base
}
#[test]
fn test_parse() {
assert_eq!(vec![Elem::Value(b"foo")], parse(&vec![b"foo"]));
assert_eq!(vec![Elem::Value(b"foo"),Elem::List(vec![Elem::Value(b"bar")])],
parse(&vec![b"foo", b"[", b"bar", b"]"]));
}