topdown/
until.rs

1use super::{CharSeq, ParserResult, Parser, Succ};
2
3pub struct Until<'a, T:'a> {
4    parser: &'a (Parser<T>+'a)
5}
6
7pub fn until<'a, T>(t:&'a (Parser<T>+'a)) -> Until<'a, T> {
8    return Until{parser: t};
9}
10
11impl<'a, T> Parser<String> for Until<'a, T> {
12    fn _parse(&self, cs: &mut CharSeq) -> ParserResult<String> {
13        let start = cs.pos;
14        while !cs.eof() {
15            if self.parser.lookahead(cs) {
16                return Succ(cs.text.as_str()[start..cs.pos].to_string());
17            }
18            cs.pos = cs.pos + 1;
19        }
20        return Succ(cs.text.as_str()[start..].to_string());
21    }
22}
23
24
25#[cfg(test)]
26#[allow(unused_variables)]
27#[allow(unused_imports)]
28mod tests {
29    use super::until;
30    use super::super::{CharSeq, ParserResult, Parser, Succ, Fail, Error};
31    #[test]
32    fn test_until1() {
33        let mut cs = CharSeq::new("abcabcdef", "<mem>");
34        let x = "def";
35        let ut = until(&x);
36        match cs.accept(&ut) {
37            Succ(c) => assert!(c.as_str() == "abcabc"),
38            _ => assert!(false, "bug")
39        }
40        assert!(cs.pos == 6);
41    }
42
43    #[test]
44    fn test_until2() {
45        let mut cs = CharSeq::new("abcdefghi", "<mem>");
46        let x = "def";
47        let ut = until(&x);
48        match cs.accept(&ut) {
49            Succ(c) => assert!(c.as_str() == "abc"),
50            _ => assert!(false, "bug")
51        }
52        assert!(cs.pos == 3);
53    }
54
55    #[test]
56    fn test_until3() {
57        let mut cs = CharSeq::new("abcdefghi", "<mem>");
58        let x = "klm";
59        let ut = until(&x);
60        match cs.accept(&ut) {
61            Succ(c) => {
62                assert_eq!(c.as_str(), "abcdefghi");
63            },
64            _ => assert!(false, "bug")
65        }
66        assert!(cs.pos == 9);
67    }
68}
69