use libafl_bolts::ClientId;
use crate::{Error, events::EventWithStats};
pub trait EventManagerHook<I, S> {
fn pre_receive(
&mut self,
state: &mut S,
client_id: ClientId,
event: &EventWithStats<I>,
) -> Result<bool, Error>;
}
pub trait EventManagerHooksTuple<I, S> {
fn pre_receive_all(
&mut self,
state: &mut S,
client_id: ClientId,
event: &EventWithStats<I>,
) -> Result<bool, Error>;
}
impl<I, S> EventManagerHooksTuple<I, S> for () {
fn pre_receive_all(
&mut self,
_state: &mut S,
_client_id: ClientId,
_event: &EventWithStats<I>,
) -> Result<bool, Error> {
Ok(true)
}
}
impl<Head, Tail, I, S> EventManagerHooksTuple<I, S> for (Head, Tail)
where
Head: EventManagerHook<I, S>,
Tail: EventManagerHooksTuple<I, S>,
{
fn pre_receive_all(
&mut self,
state: &mut S,
client_id: ClientId,
event: &EventWithStats<I>,
) -> Result<bool, Error> {
let first = self.0.pre_receive(state, client_id, event)?;
let second = self.1.pre_receive_all(state, client_id, event)?;
Ok(first & second)
}
}