Minimal Imperative Parsing Library | https://docs.rs/mipl
1use crate::prelude::*;
2
3/// Consume tokens into a new parser while the concrete
4/// parser returns something. Stop consuming if it returns
5/// `None`.
6pub struct CollectWhile<Op: ConcreteParser>(Op);
7impl<Op> ConcreteSubparser<Op> for CollectWhile<Op>
8where
9 Op: ConcreteParser
10{
11 fn subparse
12 (value: <Op>::Input, parser: &mut Parser) -> Parser
13 where
14 Op: concrete_parser::ContainerCp
15 {
16 let op = Op::new(value);
17
18 let mut tokens = Tokens::new_empty();
19
20 loop {
21 if let Some(token) = op.try_next_token(parser) {
22 tokens.add_token(token);
23 } else {
24 break;
25 }
26 }
27
28 Parser::new(tokens)
29 }
30}