lazy_template/iter/
eager_parse_iter.rs

1use crate::Template;
2use core::{convert::Infallible, marker::PhantomData, ops::Deref};
3use derive_more::IntoIterator;
4
5#[derive(Debug, Clone, Copy)]
6pub struct EagerParseIter<SegmentIter>(SegmentIter);
7
8impl<SegmentIter> Iterator for EagerParseIter<SegmentIter>
9where
10    SegmentIter: Iterator,
11    SegmentIter::Item: Deref,
12    <SegmentIter::Item as Deref>::Target: Copy,
13{
14    type Item = Result<<SegmentIter::Item as Deref>::Target, Infallible>;
15
16    fn next(&mut self) -> Option<Self::Item> {
17        self.0.next().as_deref().copied().map(Ok)
18    }
19
20    fn size_hint(&self) -> (usize, Option<usize>) {
21        self.0.size_hint()
22    }
23}
24
25#[derive(Debug, Clone, Copy, IntoIterator)]
26pub struct ParsedTemplate<SegmentContainer, Query> {
27    #[into_iterator]
28    container: SegmentContainer,
29    _query: PhantomData<Query>, // phantom Query is necessary to enable type inference later on
30}
31
32impl<SegmentContainer, Query> ParsedTemplate<SegmentContainer, Query> {
33    pub(crate) fn new(container: SegmentContainer) -> Self {
34        Self {
35            container,
36            _query: PhantomData,
37        }
38    }
39}
40
41impl<'a, SegmentContainer, Query> ParsedTemplate<SegmentContainer, Query>
42where
43    SegmentContainer: Deref + 'a,
44    &'a SegmentContainer::Target: IntoIterator,
45{
46    pub fn to_template(
47        &'a self,
48    ) -> Template<EagerParseIter<<&'a SegmentContainer::Target as IntoIterator>::IntoIter>, Query>
49    {
50        Template::new(self.iter())
51    }
52
53    pub fn iter(
54        &'a self,
55    ) -> EagerParseIter<<&'a SegmentContainer::Target as IntoIterator>::IntoIter> {
56        EagerParseIter(self.segments())
57    }
58
59    pub fn segments(&'a self) -> <&'a SegmentContainer::Target as IntoIterator>::IntoIter {
60        self.container.into_iter()
61    }
62}