use super::VirtualMachine;
use crate::runtime_hooks::{HookCallbackError, HookCallbackResult, HookContext, HookEvent, HookId};
use crate::VirtualMachineResult;
impl VirtualMachine {
pub fn try_register_hook<P, C>(
&mut self,
predicate: P,
callback: C,
priority: i32,
) -> VirtualMachineResult<HookId>
where
P: Fn(&HookEvent) -> bool + 'static + Send + Sync,
C: Fn(&HookEvent, &HookContext) -> Result<(), String> + 'static + Send + Sync,
{
self.try_register_typed_hook(
predicate,
move |event, context| callback(event, context).map_err(HookCallbackError::from),
priority,
)
}
pub fn try_register_typed_hook<P, C>(
&mut self,
predicate: P,
callback: C,
priority: i32,
) -> VirtualMachineResult<HookId>
where
P: Fn(&HookEvent) -> bool + 'static + Send + Sync,
C: Fn(&HookEvent, &HookContext) -> HookCallbackResult + 'static + Send + Sync,
{
Ok(self
.state
.try_register_hook_boxed(Box::new(predicate), Box::new(callback), priority)?)
}
#[track_caller]
pub fn register_hook<P, C>(&mut self, predicate: P, callback: C, priority: i32) -> HookId
where
P: Fn(&HookEvent) -> bool + 'static + Send + Sync,
C: Fn(&HookEvent, &HookContext) -> Result<(), String> + 'static + Send + Sync,
{
self.try_register_hook(predicate, callback, priority)
.expect("invalid hook registration")
}
#[track_caller]
pub fn register_typed_hook<P, C>(&mut self, predicate: P, callback: C, priority: i32) -> HookId
where
P: Fn(&HookEvent) -> bool + 'static + Send + Sync,
C: Fn(&HookEvent, &HookContext) -> HookCallbackResult + 'static + Send + Sync,
{
self.try_register_typed_hook(predicate, callback, priority)
.expect("invalid hook registration")
}
pub fn unregister_hook(&mut self, hook_id: HookId) -> bool {
self.state.unregister_hook(hook_id)
}
pub fn enable_hook(&mut self, hook_id: HookId) -> bool {
self.state.enable_hook(hook_id)
}
pub fn disable_hook(&mut self, hook_id: HookId) -> bool {
self.state.disable_hook(hook_id)
}
}