use crate::sys::DmaBuffer;
use std::io;
use std::rc::Rc;
#[derive(Debug, Clone)]
pub struct ReadResult {
buffer: Rc<DmaBuffer>,
offset: usize,
end: usize,
}
#[allow(clippy::len_without_is_empty)]
impl ReadResult {
pub(crate) fn from_whole_buffer(buffer: DmaBuffer) -> ReadResult {
ReadResult {
end: buffer.len(),
offset: 0,
buffer: Rc::new(buffer),
}
}
pub fn read_at(&self, offset: usize, dst: &mut [u8]) -> usize {
let offset = self.offset + offset;
self.buffer.read_at(offset, dst)
}
pub fn slice(&self, extra_offset: usize, len: usize) -> io::Result<ReadResult> {
let offset = self.offset + extra_offset;
let end = offset + len;
if offset > self.buffer.len() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
format!(
"offset {} ({} + {}) is more than the length of the buffer",
offset, self.offset, extra_offset
),
));
}
if end > self.buffer.len() {
return Err(io::Error::new(
io::ErrorKind::InvalidInput,
format!(
"length {} would cross past the end of the buffer ({} + {})",
end, offset, len
),
));
}
Ok(ReadResult {
buffer: self.buffer.clone(),
offset,
end,
})
}
pub fn len(&self) -> usize {
self.end - self.offset
}
pub fn as_bytes(&self) -> &[u8] {
&self.buffer.as_bytes()[self.offset..self.end]
}
}