1use std::iter::FusedIterator;
2
3use crate::{Event, Parser, ParserError};
4
5pub struct ParserIter<'a> {
9 parser: Box<Parser<'a>>,
10 fuse_burnt: bool,
11}
12
13impl<'a> ParserIter<'a> {
14 pub fn new(parser: Box<Parser<'a>>) -> Self {
16 Self { parser, fuse_burnt: false }
17 }
18}
19
20impl Iterator for ParserIter<'_> {
21 type Item = Result<Event, ParserError>;
22
23 fn next(&mut self) -> Option<Self::Item> {
24 if self.fuse_burnt {
25 None
26 } else {
27 match self.parser.parse() {
28 ret @ Ok(Event::StreamEnd) | ret @ Err(_) => {
29 self.fuse_burnt = true;
30 Some(ret)
31 },
32 ret => {
33 Some(ret)
34 },
35 }
36 }
37 }
38}
39
40impl FusedIterator for ParserIter<'_> {
41}