[][src]Function combine::parser::repeat::take_until

pub fn take_until<F, P>(end: P) -> TakeUntil<F, P> where
    F: Extend<<P::Input as StreamOnce>::Item> + Default,
    P: Parser

Takes input until end is encountered or end indicates that it has consumed input before failing (attempt can be used to make it look like it has not consumed any input)

    let mut char_parser = take_until(char::digit());
    assert_eq!(char_parser.parse("abc123"), Ok(("abc".to_string(), "123")));

    let mut byte_parser = take_until(byte::bytes(&b"TAG"[..]));
    assert_eq!(byte_parser.parse(&b"123TAG"[..]), Ok((b"123".to_vec(), &b"TAG"[..])));
    assert!(byte_parser.parse(&b"123TATAG"[..]).is_err());

    // `attempt` must be used if the `end` should be consume input before failing
    let mut byte_parser = take_until(attempt(byte::bytes(&b"TAG"[..])));
    assert_eq!(byte_parser.parse(&b"123TATAG"[..]), Ok((b"123TA".to_vec(), &b"TAG"[..])));
}