use crate::memory::{
error::{Error, ErrorKind, Result},
primitives::PhysicalAddress,
};
use std::ops::Range;
pub trait Readable: Send + Sync {
fn read(&self, buffer: &mut [u8], physical_address: PhysicalAddress) -> Result<usize>;
fn read_exact(&self, buffer: &mut [u8], physical_address: PhysicalAddress) -> Result<()> {
let bytes_read = self.read(buffer, physical_address)?;
if bytes_read != buffer.len() {
Err(Error::new(
ErrorKind::IOError,
&format!("Failed to read more than {bytes_read} bytes"),
))
} else {
Ok(())
}
}
fn len(&self) -> Result<u64>;
fn is_empty(&self) -> Result<bool> {
Ok(self.len()? == 0)
}
fn regions(&self) -> Result<Vec<Range<PhysicalAddress>>> {
Ok(vec![Range {
start: PhysicalAddress::default(),
end: PhysicalAddress::new(self.len()?),
}])
}
}