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