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