use nom::error::ParseError; use nom::IResult; use nom::InputLength; use super::Context; pub fn context_many1<'r: 's, 's, I, O, E, M>( context: Context<'r, 's>, mut many_matcher: M, ) -> impl FnMut(I) -> IResult, E> + 'r where I: Clone + InputLength, E: ParseError, M: for<'x> Fn(Context<'x, 's>, I) -> IResult + 'r, { move |mut i: I| { let mut err = None; let mut elements: Vec = Vec::new(); loop { match many_matcher(&context, i.clone()) { Ok((remaining, many_elem)) => { i = remaining; elements.push(many_elem); } the_error @ Err(_) => { err = Some(the_error); break; } } } if elements.is_empty() { if let Some(err) = err { err?; } } Ok((i, elements)) } }