use crate::types::{Config, Error, Result};
pub(super) fn image_block_mut(image: &mut [u8], cfg: Config, block: u32) -> Result<&mut [u8]> {
let block = block as usize;
if block >= cfg.block_count {
return Err(Error::OutOfBounds);
}
let start = block
.checked_mul(cfg.block_size)
.ok_or(Error::InvalidConfig)?;
let end = start
.checked_add(cfg.block_size)
.ok_or(Error::InvalidConfig)?;
image.get_mut(start..end).ok_or(Error::OutOfBounds)
}
pub(super) fn erase_block(image: &mut [u8], cfg: Config, block: u32) -> Result<()> {
image_block_mut(image, cfg, block)?.fill(0xff);
Ok(())
}
pub(super) fn program(block: &mut [u8], off: usize, data: &[u8]) -> Result<()> {
let end = off.checked_add(data.len()).ok_or(Error::NoSpace)?;
if end > block.len() {
return Err(Error::NoSpace);
}
for (dst, src) in block[off..end].iter_mut().zip(data) {
*dst &= *src;
}
Ok(())
}