libyaml/
parser_iter.rs

1use std::iter::FusedIterator;
2
3use crate::{Event, Parser, ParserError};
4
5/// Iterator adapter for [`Parser`].
6///
7/// [`Parser`]: struct.Parser.html
8pub struct ParserIter<'a> {
9    parser: Box<Parser<'a>>,
10    fuse_burnt: bool,
11}
12
13impl<'a> ParserIter<'a> {
14    /// Convert a parser into an iterator.
15    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}