#[derive(Debug, Clone)]
pub struct SliceError;
pub trait Source {
type Error: core::fmt::Debug;
fn read(&self, offset: u32, buffer: &mut [u8]) -> Result<(), Self::Error>;
fn read_u32_be(&self, offset: u32) -> Result<u32, Self::Error> {
let mut bytes = [0; 4];
self.read(offset, &mut bytes)?;
Ok(u32::from_be_bytes(bytes))
}
fn read_u32_le(&self, offset: u32) -> Result<u32, Self::Error> {
let mut bytes = [0; 4];
self.read(offset, &mut bytes)?;
Ok(u32::from_le_bytes(bytes))
}
fn read_u16_be(&self, offset: u32) -> Result<u16, Self::Error> {
let mut bytes = [0; 2];
self.read(offset, &mut bytes)?;
Ok(u16::from_be_bytes(bytes))
}
fn read_u16_le(&self, offset: u32) -> Result<u16, Self::Error> {
let mut bytes = [0; 2];
self.read(offset, &mut bytes)?;
Ok(u16::from_le_bytes(bytes))
}
fn read_u8(&self, offset: u32) -> Result<u8, Self::Error> {
let mut bytes = [0; 1];
self.read(offset, &mut bytes)?;
Ok(bytes[0])
}
}
impl Source for &[u8] {
type Error = SliceError;
fn read(&self, offset: u32, buffer: &mut [u8]) -> Result<(), Self::Error> {
let desired_len = buffer.len();
assert!(offset < (usize::MAX - desired_len) as u32);
let offset = offset as usize;
if let Some(sub_slice) = self.get(offset..offset + desired_len) {
buffer.copy_from_slice(sub_slice);
Ok(())
} else {
Err(SliceError)
}
}
}