use crate::{CompilationError, TrapCode};
use alloc::vec::Vec;
pub fn checked_memory_range_end(offset: usize, length: usize) -> Result<usize, TrapCode> {
offset
.checked_add(length)
.ok_or(TrapCode::MemoryOutOfBounds)
}
pub trait StoreTr<T> {
fn memory_read(&mut self, offset: usize, buffer: &mut [u8]) -> Result<(), TrapCode>;
fn memory_read_into_vec(&mut self, offset: usize, length: usize) -> Result<Vec<u8>, TrapCode>;
fn memory_write(&mut self, offset: usize, buffer: &[u8]) -> Result<(), TrapCode>;
fn data_mut(&mut self) -> &mut T;
fn data(&self) -> &T;
fn try_consume_fuel(&mut self, delta: u64) -> Result<(), TrapCode>;
fn remaining_fuel(&self) -> Option<u64>;
fn reset_fuel(&mut self, new_fuel_limit: u64);
}
pub trait CallerTr<T>: StoreTr<T> {}
#[derive(Debug)]
pub enum StrategyError {
CompilationError(CompilationError),
TrapCode(TrapCode),
}
impl From<CompilationError> for StrategyError {
fn from(err: CompilationError) -> Self {
StrategyError::CompilationError(err)
}
}
impl From<TrapCode> for StrategyError {
fn from(err: TrapCode) -> Self {
StrategyError::TrapCode(err)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn checked_memory_range_end_rejects_overflow() {
assert_eq!(
checked_memory_range_end(usize::MAX, 1).unwrap_err(),
TrapCode::MemoryOutOfBounds
);
}
}