lazy_template/iter/
lazy_parse_iter.rs1use 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}