use crate::schema::{WEB_EVENT_BUFFER_MAX_BYTES, WEB_RUST_REGION_BASE};
#[derive(Debug, Default)]
pub struct LentEventBuffer {
bytes: Vec<u8>,
}
impl LentEventBuffer {
pub const fn new() -> Self {
Self { bytes: Vec::new() }
}
pub fn len(&self) -> usize {
self.bytes.len()
}
pub fn is_empty(&self) -> bool {
self.bytes.is_empty()
}
pub fn lend(&mut self, min_len: u32) -> Option<*mut u8> {
if min_len == 0 || min_len > WEB_EVENT_BUFFER_MAX_BYTES {
return None;
}
let wanted = min_len as usize;
if self.bytes.len() < wanted {
let mut grown = Vec::new();
grown.try_reserve_exact(wanted).ok()?;
grown.resize(wanted, 0);
self.bytes = grown;
}
Some(self.bytes.as_mut_ptr())
}
}
pub fn region_address(pointer: *const u8) -> u32 {
let address = pointer as usize;
match u32::try_from(address) {
Ok(address) if address >= WEB_RUST_REGION_BASE => address,
_ => 0,
}
}