Minimal Imperative Parsing Library | https://docs.rs/mipl
1use crate::prelude::*;
2
3/// Consume tokens into a new parser until the concrete
4/// parser returns something. Stops when it hits `Some(_)`.
5///
6/// Said concrete pattern here is provided by
7/// the generic parameter `Op`.
8pub struct CollectUntil<Op: ConcreteParser>(Op);
9impl<Op> ConcreteSubparser<Op> for CollectUntil<Op>
10where
11 Op: ConcreteParser
12{
13 fn subparse
14 (value: Op::Input, parser: &mut Parser) -> Parser
15 where
16 Op: concrete_parser::ContainerCp
17 {
18 let op = Op::new(value);
19
20 let mut tokens: Tokens = Tokens::new_empty();
21
22 loop {
23 if let Some(_token) = op.peek_for_token(parser) {
24 break;
25 } else {
26 if let Some(token) = parser.next() {
27 tokens.add_token(token);
28 } else {
29 break;
30 }
31 }
32 }
33
34 Parser::new(tokens)
35 }
36}