use super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
pub struct Try<'a, T:'a> {
parser: &'a (Parser<T> + 'a)
}
pub fn try<'a, T>(p: &'a(Parser<T>+'a)) -> Try<'a, T> {
return Try{parser:p};
}
impl<'a, T> Parser<T> for Try<'a, T> {
#[allow(unused_variables)]
fn _parse(&self, cs: &mut CharSeq) -> ParserResult<T> {
let p = cs.pos;
match cs.accept(self.parser) {
Succ(c) => return Succ(c),
Fail(m, l) => {
cs.pos = p;
return Fail(m, l)
},
Error(m, l) => return Error(m, l)
}
}
}
#[cfg(test)]
#[allow(unused_variables)]
#[allow(unused_imports)]
mod tests {
use super::try;
use super::super::{CharSeq, wrap, ParserResult, Parser, Succ, Fail, Error};
fn p(cs : &mut CharSeq) -> ParserResult<String> {
cs.accept(&"abc");
cs.accept(&"def")
}
#[test]
fn test_try() {
let mut cs = CharSeq::new("abcxyz", "");
let f = wrap(p);
let t = try(&f);
cs.accept(&t);
assert_eq!(0, cs.pos);
cs.accept(&f);
assert_eq!(3, cs.pos);
}
}