use crate::{MemoryError, TableError};
use core::{
error::Error,
fmt,
fmt::{Debug, Display},
};
#[derive(Debug, Copy, Clone)]
pub enum LimiterError {
ResourceLimiterDeniedAllocation,
}
impl Error for LimiterError {}
impl Display for LimiterError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let message = match self {
Self::ResourceLimiterDeniedAllocation => "resource limiter denied allocation",
};
f.write_str(message)
}
}
pub trait ResourceLimiter {
fn memory_growing(
&mut self,
current: usize,
desired: usize,
maximum: Option<usize>,
) -> Result<bool, LimiterError>;
fn table_growing(
&mut self,
current: usize,
desired: usize,
maximum: Option<usize>,
) -> Result<bool, LimiterError>;
fn memory_grow_failed(&mut self, _error: &MemoryError) -> Result<(), LimiterError> {
Ok(())
}
fn table_grow_failed(&mut self, _error: &TableError) -> Result<(), LimiterError> {
Ok(())
}
fn instances(&self) -> usize;
fn tables(&self) -> usize;
fn memories(&self) -> usize;
}
#[derive(Default)]
pub struct ResourceLimiterRef<'a>(Option<&'a mut dyn ResourceLimiter>);
impl Debug for ResourceLimiterRef<'_> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "ResourceLimiterRef(...)")
}
}
impl<'a> From<&'a mut dyn ResourceLimiter> for ResourceLimiterRef<'a> {
fn from(limiter: &'a mut dyn ResourceLimiter) -> Self {
Self(Some(limiter))
}
}
impl ResourceLimiterRef<'_> {
pub fn as_resource_limiter(&mut self) -> Option<&mut dyn ResourceLimiter> {
match self.0.as_mut() {
Some(limiter) => Some(*limiter),
None => None,
}
}
}