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
use try_from::TryFrom;

use crate::{Error, ErrorKind, Result};

pub trait ParseIterator: Iterator {
    fn try_from_next<R, E>(&mut self) -> Result<R>
    where
        R: TryFrom<<Self as Iterator>::Item, Err = E>,
        Error: From<E>;
}

impl<T> ParseIterator for T
where
    T: Iterator,
{
    fn try_from_next<R, E>(&mut self) -> Result<R>
    where
        R: TryFrom<<Self as Iterator>::Item, Err = E>,
        Error: From<E>,
    {
        let value = self.next().ok_or_else(|| Error::new(ErrorKind::Parse))?;

        try_from::TryFrom::try_from(value).map_err(Into::into)
    }
}