use alloc::{borrow::Cow, vec::Vec};
use core::fmt::Debug;
use libafl_bolts::{Error, Named, ownedref::OwnedMutPtr};
use serde::{Deserialize, Serialize};
use crate::observers::Observer;
#[derive(Serialize, Deserialize, Debug)]
#[serde(bound = "T: Serialize + for<'a> Deserialize<'a>")]
pub struct ListObserver<T> {
name: Cow<'static, str>,
list: OwnedMutPtr<Vec<T>>,
}
impl<T> ListObserver<T> {
#[must_use]
pub fn new(name: &'static str, list: OwnedMutPtr<Vec<T>>) -> Self {
Self {
name: Cow::from(name),
list,
}
}
#[must_use]
pub fn list(&self) -> &Vec<T> {
self.list.as_ref()
}
#[must_use]
pub fn list_mut(&mut self) -> &mut Vec<T> {
self.list.as_mut()
}
}
impl<I, S, T> Observer<I, S> for ListObserver<T> {
fn pre_exec(&mut self, _state: &mut S, _input: &I) -> Result<(), Error> {
self.list.as_mut().clear();
Ok(())
}
}
impl<T> Named for ListObserver<T> {
fn name(&self) -> &Cow<'static, str> {
&self.name
}
}