mipl 0.2.1

Minimal Imperative Parsing Library
Documentation
use crate::prelude::*;

/// Consume tokens into a new parser until the concrete
/// parser returns something. Stops when it hits `Some(_)`.
/// 
/// Said concrete pattern here is provided by
/// the generic parameter `Op`.
pub struct CollectUntil<Op: ConcreteParser>(Op);
impl<Op> ConcreteSubparser<Op> for CollectUntil<Op>
where
    Op: ConcreteParser
{
    fn subparse
    (value: Op::Input, parser: &mut Parser) -> Parser
    where
    Op: concrete_parser::ContainerCp 
    {
        let op = Op::new(value);

        let mut tokens: Tokens = Tokens::new_empty();

        loop {
            if let Some(_token) = op.peek_for_token(parser) {
                break;
            } else {
                if let Some(token) = parser.next() {
                    tokens.add_token(token);
                } else {
                    break;
                }
            }
        }

        Parser::new(tokens)
    }
}