topdown/
wrapper.rs

1use super::{CharSeq, ParserResult, Parser, ParserHook};
2use std::marker::PhantomData;
3
4pub struct FunctionWrapper<F, T> {
5    func: F,
6    phantom: PhantomData<T>
7}
8
9impl<F, T> Parser<T> for FunctionWrapper<F, T> where F: Fn(&mut CharSeq) -> ParserResult<T> {
10    fn _parse(&self, cs: &mut CharSeq) -> ParserResult<T> {
11        (self.func)(cs)
12    }
13}
14
15impl<F, T> ParserHook for FunctionWrapper<F, T> where F: Fn(&mut CharSeq) -> ParserResult<T> {
16    fn hook(&self, cs: &mut CharSeq)  {
17        (self.func)(cs);
18    }
19}
20
21pub fn wrap<F, T>(f: F) -> FunctionWrapper<F, T> where F: Fn(&mut CharSeq) -> ParserResult<T> {
22    FunctionWrapper{func: f, phantom:PhantomData}
23}
24
25#[cfg(test)]
26#[allow(unused_variables)]
27#[allow(unused_imports)]
28mod tests {
29    use super::wrap;
30    use super::super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
31
32    fn some_parser(cs: &mut CharSeq) -> ParserResult<Vec<String>> {
33        let x = "abc";
34        let y = "def";
35        let z = "ghi";
36        cs.accept(&x).and_then(|a|
37            cs.accept(&y).and_then(|b|
38            cs.accept(&z).map(|c| {
39                vec!(a.to_string(), b.to_string(), c.to_string())
40            }
41        )))
42    }
43
44    #[test]
45    fn test_wrap1() {
46        let mut cs = CharSeq::new("abcdefghi", "");
47        let w = wrap(some_parser);
48        match cs.accept(&w) {
49            Succ(x) => assert_eq!(x, vec!("abc".to_string(), "def".to_string(), "ghi".to_string())),
50            Fail(m, l) => assert!(false, "failed"),
51            Error(m, l) => assert!(false, "error")
52        }
53    }
54
55    #[test]
56    fn test_wrap2() {
57        let w = wrap(some_parser);
58        let mut cs = CharSeq::new("abcdefghixxxabcdefghi", "");
59        cs.add_hook(&w);
60        match cs.accept(&"xxx") {
61            Succ(x) => assert_eq!(x.as_slice(), "xxx"),
62            Fail(m, l) => assert!(false, "failed"),
63            Error(m, l) => assert!(false, "error")
64        }
65    }
66}