use crate::{Errors, section::{GenericSection, SectionCore}};
pub struct SegmentIterator<'a> {
data: &'a[u8],
index: usize,
last_error: Option<Errors>,
}
impl<'a> SegmentIterator<'a> {
pub fn new(data: &'a[u8]) -> SegmentIterator<'a> {
SegmentIterator {
data,
index: 0,
last_error: None,
}
}
pub fn is_valid(&self) -> bool { self.last_error.is_none() }
pub fn to_error(self) -> Errors {self.last_error.unwrap()}
pub fn internal_index(&self) -> usize { self.index }
pub fn internal_slice(&self) -> &[u8] { self.data }
}
impl<'a> std::iter::Iterator for SegmentIterator<'a> {
type Item = GenericSection<'a>;
fn next(&mut self) -> Option<Self::Item> {
if self.data.len() <= self.index {
return None;
}
GenericSection::from_slice(&self.data[self.index..])
.and_then(|f| {
self.index += f.len();
Ok(f)
}).or_else(|e|{
self.last_error = Some(e);
Err(Errors::NoData)
}).ok()
}
}