use crate::error::{BufferTooShortDetail, ParseError};
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct Txt<'a> {
rdata: &'a [u8],
}
impl<'a> Txt<'a> {
pub const fn from_rdata(rdata: &'a [u8]) -> Self {
Self { rdata }
}
pub fn segments(&self) -> TxtSegments<'a> {
TxtSegments { rest: self.rdata }
}
}
pub struct TxtSegments<'a> {
rest: &'a [u8],
}
impl<'a> Iterator for TxtSegments<'a> {
type Item = Result<&'a [u8], ParseError>;
fn next(&mut self) -> Option<Self::Item> {
let &len_byte = self.rest.first()?;
let len = len_byte as usize;
let after_len = match self.rest.get(1..) {
Some(s) => s,
None => {
self.rest = &[];
return Some(Err(ParseError::BufferTooShort(BufferTooShortDetail::new(
1, 0, 0,
))));
}
};
let (segment, rest) = match after_len.split_at_checked(len) {
Some(pair) => pair,
None => {
self.rest = &[];
return Some(Err(ParseError::BufferTooShort(BufferTooShortDetail::new(
len,
0,
after_len.len(),
))));
}
};
self.rest = rest;
Some(Ok(segment))
}
}
#[cfg(test)]
#[allow(clippy::unwrap_used)]
mod tests;