use std::borrow::Cow;
use libafl::{Error, observers::Observer};
use libafl_bolts::Named;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct PacketObserver {
name: Cow<'static, str>,
last_packet: Option<Vec<u8>>,
}
impl PacketObserver {
pub fn new<S>(name: S) -> Self
where
S: Into<Cow<'static, str>>,
{
Self {
name: name.into(),
last_packet: None,
}
}
pub fn clear(&mut self) {
self.last_packet = None;
}
pub fn set_packet(&mut self, packet: Vec<u8>) {
self.last_packet = Some(packet);
}
pub fn last_packet(&self) -> Option<&Vec<u8>> {
self.last_packet.as_ref()
}
}
impl Named for PacketObserver {
fn name(&self) -> &Cow<'static, str> {
&self.name
}
}
impl<I, S> Observer<I, S> for PacketObserver {
fn post_exec(
&mut self,
_state: &mut S,
_input: &I,
_exit_kind: &libafl::executors::ExitKind,
) -> Result<(), Error> {
Ok(())
}
}