1use crate::{CompilationError, TrapCode};
2use alloc::vec::Vec;
3
4pub fn checked_memory_range_end(offset: usize, length: usize) -> Result<usize, TrapCode> {
5 offset
6 .checked_add(length)
7 .ok_or(TrapCode::MemoryOutOfBounds)
8}
9
10pub trait StoreTr<T> {
11 fn memory_read(&mut self, offset: usize, buffer: &mut [u8]) -> Result<(), TrapCode>;
12
13 fn memory_read_into_vec(&mut self, offset: usize, length: usize) -> Result<Vec<u8>, TrapCode>;
14
15 fn memory_write(&mut self, offset: usize, buffer: &[u8]) -> Result<(), TrapCode>;
16
17 fn data_mut(&mut self) -> &mut T;
18
19 fn data(&self) -> &T;
20
21 fn try_consume_fuel(&mut self, delta: u64) -> Result<(), TrapCode>;
22
23 fn remaining_fuel(&self) -> Option<u64>;
24
25 fn reset_fuel(&mut self, new_fuel_limit: u64);
26}
27
28pub trait CallerTr<T>: StoreTr<T> {}
29
30#[derive(Debug)]
31pub enum StrategyError {
32 CompilationError(CompilationError),
33 TrapCode(TrapCode),
34}
35
36impl From<CompilationError> for StrategyError {
37 fn from(err: CompilationError) -> Self {
38 StrategyError::CompilationError(err)
39 }
40}
41impl From<TrapCode> for StrategyError {
42 fn from(err: TrapCode) -> Self {
43 StrategyError::TrapCode(err)
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn checked_memory_range_end_rejects_overflow() {
53 assert_eq!(
54 checked_memory_range_end(usize::MAX, 1).unwrap_err(),
55 TrapCode::MemoryOutOfBounds
56 );
57 }
58}