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