vt_push_parser/
iter.rs

1use crate::{VTPushParser, event::VTOwnedEvent};
2
3/// A convenience wrapper around `VTPushParser` that implements `Iterator` for
4/// any `Iterator` of `AsRef<[u8]>`.
5///
6/// _PERFORMANCE NOTE_: This will allocate significantly more than using the
7/// parser directly, but may be more convenient for some use cases.
8pub struct VTIterator<I>
9where
10    I: Iterator,
11    I::Item: AsRef<[u8]>,
12{
13    parser: VTPushParser,
14    iter: I,
15    events: Vec<VTOwnedEvent>,
16}
17
18impl<I> VTIterator<I>
19where
20    I: Iterator,
21    I::Item: AsRef<[u8]>,
22{
23    pub fn new(iter: I) -> Self {
24        Self {
25            parser: VTPushParser::new(),
26            iter,
27            events: Vec::new(),
28        }
29    }
30}
31
32impl<I> Iterator for VTIterator<I>
33where
34    I: Iterator,
35    I::Item: AsRef<[u8]>,
36{
37    type Item = VTOwnedEvent;
38
39    fn next(&mut self) -> Option<Self::Item> {
40        while self.events.is_empty() {
41            if let Some(next) = self.iter.next() {
42                self.parser.feed_with(next.as_ref(), &mut |event| {
43                    self.events.push(event.to_owned());
44                });
45            } else {
46                return None;
47            }
48        }
49
50        self.events.pop()
51    }
52}