use crate::Reader;
#[cfg(not(feature = "std"))]
use alloc::{format, string::String, vec::Vec};
#[derive(Debug)]
pub struct MemoryReader {
data: Vec<u8>,
base_address: u32,
}
impl MemoryReader {
pub fn new(data: Vec<u8>, base_address: u32) -> Self {
Self { data, base_address }
}
}
impl Reader for MemoryReader {
type Error = String;
async fn read(&mut self, addr: u32, buf: &mut [u8]) -> Result<(), Self::Error> {
if addr < self.base_address {
return Err(format!(
"Address 0x{:08X} is below base address 0x{:08X}",
addr, self.base_address
));
}
let offset = (addr - self.base_address) as usize;
let end = offset.saturating_add(buf.len());
if end > self.data.len() {
return Err(format!(
"Read at 0x{:08X} (offset {}) extends past firmware end",
addr, offset
));
}
buf.copy_from_slice(&self.data[offset..end]);
Ok(())
}
fn update_base_address(&mut self, new_base: u32) {
self.base_address = new_base;
}
}