1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
use crate::Parser; use std::io::Read; pub struct ParserIter<R, P> { reader: R, parser: P, } impl<R, P> ParserIter<R, P> { pub fn new(reader: R, parser: P) -> Self { ParserIter { reader, parser } } } impl<R, P> Iterator for ParserIter<R, Option<P>> where R: Read, P: Parser<Next = Option<P>>, { type Item = Result<P::Item, P::Error>; fn next(&mut self) -> Option<Self::Item> { let (val, next) = match self.parser.take()?.next(&mut self.reader) { Ok(v) => v, Err(e) => return Some(Err(e)), }; self.parser = next; Some(Ok(val)) } } impl<R, P> Iterator for ParserIter<R, &'_ mut Option<P>> where R: Read, P: Parser<Next = Option<P>>, { type Item = Result<P::Item, P::Error>; fn next(&mut self) -> Option<Self::Item> { let (val, next) = match self.parser.take()?.next(&mut self.reader) { Ok(v) => v, Err(e) => return Some(Err(e)), }; *self.parser = next; Some(Ok(val)) } } pub trait IntoParserIter: Sized { type Item; type Error; fn parse_iter<R: Read>(self, reader: R) -> ParserIter<R, Self> where ParserIter<R, Self>: Iterator<Item = Result<Self::Item, Self::Error>>; } impl<T> IntoParserIter for Option<T> where T: Parser<Next = Option<T>>, { type Item = T::Item; type Error = T::Error; fn parse_iter<R: Read>(self, reader: R) -> ParserIter<R, Self> { ParserIter::new(reader, self) } } impl<T> IntoParserIter for &'_ mut Option<T> where T: Parser<Next = Option<T>>, { type Item = T::Item; type Error = T::Error; fn parse_iter<R: Read>(self, reader: R) -> ParserIter<R, Self> { ParserIter::new(reader, self) } }