1use crate::input::InputError;
2use crate::parser::{ParseState, Parser};
3use std::iter::FusedIterator;
4
5#[derive(Copy, Clone)]
9#[must_use = "iterators are lazy and do nothing unless consumed"]
10pub struct ParserIterator<'a, P> {
11 pub(super) input: &'a str,
12 pub(super) remaining: &'a [u8],
13 pub(super) parser: P,
14}
15
16impl<'a, P: Parser<'a>> Iterator for ParserIterator<'a, P> {
17 type Item = Result<P::Output, InputError>;
18
19 #[inline]
20 fn next(&mut self) -> Option<Self::Item> {
21 if self.remaining.is_empty() {
22 return None;
23 }
24
25 let mut state = ParseState::default();
27 if let Ok((v, remaining)) =
28 self.parser
29 .parse_ctx(self.remaining, &mut state, &mut false, false)
30 {
31 self.remaining = remaining;
32 Some(Ok(v))
33 } else {
34 self.remaining = &[]; Some(Err(state.into_input_error(self.input)))
36 }
37 }
38}
39
40impl<'a, P: Parser<'a>> FusedIterator for ParserIterator<'a, P> {}
41
42impl<'a, P: Parser<'a>> ParserIterator<'a, P> {
43 #[inline]
57 pub fn remaining(&self) -> &'a [u8] {
58 self.remaining
59 }
60}
61
62#[derive(Copy, Clone)]
66#[must_use = "iterators are lazy and do nothing unless consumed"]
67pub struct ParserMatchesIterator<'a, P> {
68 pub(super) remaining: &'a [u8],
69 pub(super) parser: P,
70}
71
72impl<'a, P: Parser<'a>> Iterator for ParserMatchesIterator<'a, P> {
73 type Item = P::Output;
74
75 #[inline]
76 fn next(&mut self) -> Option<Self::Item> {
77 while !self.remaining.is_empty() {
78 if let Ok((v, remaining)) = self.parser.parse_ctx(
80 self.remaining,
81 &mut ParseState::default(),
82 &mut false,
83 false,
84 ) {
85 self.remaining = remaining;
86 return Some(v);
87 }
88 self.remaining = &self.remaining[1..];
89 }
90 None
91 }
92}
93
94impl<'a, P: Parser<'a>> FusedIterator for ParserMatchesIterator<'a, P> {}
95
96impl<'a, P: Parser<'a>> ParserMatchesIterator<'a, P> {
97 #[inline]
110 pub fn remaining(&self) -> &'a [u8] {
111 self.remaining
112 }
113}