topdown/
cond.rs

1use super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
2
3pub struct Cond<'a, S:'a, T:'a> {
4    cond: &'a (Parser<S> + 'a),
5    parser: &'a (Parser<T> + 'a),
6    else_value: T
7}
8
9pub fn cond<'a, S, T:Clone>(c: &'a (Parser<S> + 'a), p: &'a (Parser<T> + 'a), e: T) -> Cond<'a, S, T> {
10    return Cond{cond:c, parser:p, else_value: e};
11}
12
13impl<'a, S, T:Clone> Parser<T> for Cond<'a, S, T> {
14    #[allow(unused_variables)]
15    fn _parse(&self, cs: &mut CharSeq) -> ParserResult<T> {
16        match cs.accept(self.cond) {
17            Succ(r) => cs.accept(self.parser),
18            Fail(m, l) => Succ(self.else_value.clone()),
19            Error(m, l) => Error(m, l)
20        }
21    }
22}
23
24
25#[cfg(test)]
26#[allow(unused_variables)]
27#[allow(unused_imports)]
28mod tests {
29    use super::cond;
30    use super::super::{CharSeq, skip, ParserResult, Parser, Succ, Fail, Error};
31
32    #[test]
33    fn test_cond1() {
34        let mut cs = CharSeq::new("ab", "");
35        let a = "a";
36        let b = "b";
37        let c = cond(&a, &b, "default".to_string());
38        match cs.accept(&c) {
39            Succ(r) => assert_eq!(r.as_slice(), "b"),
40            _ => assert!(false)
41        }
42    }
43
44    #[test]
45    fn test_cond2() {
46        let mut cs = CharSeq::new("bb", "");
47        let a = "a";
48        let b = "b";
49        let c = cond(&a, &b, "default".to_string());
50        match cs.accept(&c) {
51            Succ(r) => assert_eq!(r.as_slice(), "default"),
52            _ => assert!(false)
53        }
54    }
55
56    #[test]
57    fn test_cond3() {
58        let mut cs = CharSeq::new("ax", "");
59        let a = "a";
60        let b = "b";
61        let c = cond(&a, &b, "default".to_string());
62        match cs.accept(&c) {
63            Fail(m, l) => (),
64            _ => assert!(false)
65        }
66    }
67}
68