1use crate::{VTPushParser, event::VTOwnedEvent};
2
3pub 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}