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); impl ConcreteSubparser for CollectUntil 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) } }