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