sfw-tools 0.5.0

Functions and programs from the book Software Tools
Documentation
use std::io::Error;
use std::io::ErrorKind::InvalidData;

pub trait IterExtra: Iterator {
    fn safe_take(self, nn: usize) -> Result<Vec<Self::Item>, Error>;
}

impl<I: Iterator> IterExtra for I {
    fn safe_take(self, nn: usize) -> Result<Vec<Self::Item>, Error>
    where
        I: Sized,
    {
        let result_vec = self.take(nn).collect::<Vec<Self::Item>>();
        let vec_len = result_vec.len();
        if vec_len == nn {
            Ok(result_vec)
        } else {
            Err(Error::new(InvalidData
                           , format!("safe_take could only take {} elements, needed at least {}."
                                     , vec_len, nn)))
        }
    }
}