lazy_template/iter/
lazy_parse_iter.rs

1use crate::Parse;
2
3#[derive(Debug)]
4pub struct LazyParseIter<'a, Parser> {
5    template: &'a str,
6    parser: &'a Parser,
7}
8
9impl<'a, Parser> Clone for LazyParseIter<'a, Parser> {
10    fn clone(&self) -> Self {
11        *self
12    }
13}
14
15impl<'a, Parser> Copy for LazyParseIter<'a, Parser> {}
16
17impl<'a, Parser> LazyParseIter<'a, Parser> {
18    pub(crate) fn new(template: &'a str, parser: &'a Parser) -> Self {
19        Self { template, parser }
20    }
21}
22
23impl<'a, Parser> Iterator for LazyParseIter<'a, Parser>
24where
25    Parser: Parse<'a>,
26{
27    type Item = Result<Parser::Output, Parser::Error>;
28
29    fn next(&mut self) -> Option<Self::Item> {
30        if self.template.is_empty() {
31            return None;
32        }
33
34        let (segment, rest) = match self.parser.parse(self.template) {
35            Ok(pair) => pair,
36            Err(error) => return Some(Err(error)),
37        };
38
39        self.template = rest;
40        Some(Ok(segment))
41    }
42}
43
44impl<'a, Parser> IntoIterator for &'a LazyParseIter<'a, Parser>
45where
46    Parser: Parse<'a>,
47{
48    type IntoIter = LazyParseIter<'a, Parser>;
49    type Item = Result<Parser::Output, Parser::Error>;
50    fn into_iter(self) -> Self::IntoIter {
51        *self
52    }
53}