topdown/
skip.rs

1use super::{CharSeq, ParserHook, ParserResult, Parser, Succ};
2
3pub struct Skip<'a> {
4    skip_char: &'a str
5}
6
7pub fn skip<'a>(chars: &'a str) -> Skip<'a> {
8    return Skip{skip_char: chars};
9}
10
11impl<'a> ParserHook for Skip<'a> {
12    fn hook(&self, cs: &mut CharSeq) {
13        while self.skip_char.contains(cs.current()) {
14            cs.next();
15        }
16    }
17}
18
19impl<'a> Parser<String> for Skip<'a> {
20    fn _parse(&self, cs: &mut CharSeq) -> ParserResult<String> {
21        let mut r = String::new();
22        while self.skip_char.contains(cs.current()) {
23            r.push(cs.current());
24            cs.next();
25        }
26        return Succ(r);
27    }
28}
29
30#[cfg(test)]
31#[allow(unused_variables)]
32#[allow(unused_imports)]
33mod tests {
34    use super::skip;
35    use super::super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
36    #[test]
37    fn test_skip_ws1() {
38        let skip_ws = skip(" \t\r\n");
39        let mut cs = CharSeq::new("ab\tc\n   d ", "<mem>");
40        cs.add_hook(&skip_ws);
41        let a = "a";
42        let b = "b";
43        let c = "c";
44        let d = "d";
45        match cs.accept(&a) {
46            Succ(r) => assert_eq!(r.as_slice(), "a"),
47            Fail(m, l) => assert!(false),
48            Error(m, l) => assert!(false)
49        }
50        match cs.accept(&b) {
51            Succ(r) => assert_eq!(r.as_slice(), "b"),
52            Fail(m, l) => assert!(false),
53            Error(m, l) => assert!(false)
54        }
55        match cs.accept(&c) {
56            Succ(r) => assert_eq!(r.as_slice(), "c"),
57            Fail(m, l) => assert!(false),
58            Error(m, l) => assert!(false)
59        }
60        match cs.accept(&d) {
61            Succ(r) => assert_eq!(r.as_slice(), "d"),
62            Fail(m, l) => assert!(false),
63            Error(m, l) => assert!(false)
64        }
65    }
66}
67