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}