1use alloc::{borrow::Cow, vec::Vec};
2use core::fmt::Debug;
3
4use libafl_bolts::{Error, Named, ownedref::OwnedMutPtr};
5use serde::{Deserialize, Serialize};
6
7use crate::observers::Observer;
8
9#[derive(Serialize, Deserialize, Debug)]
11#[serde(bound = "T: Serialize + for<'a> Deserialize<'a>")]
12pub struct ListObserver<T> {
13 name: Cow<'static, str>,
14 list: OwnedMutPtr<Vec<T>>,
16}
17
18impl<T> ListObserver<T> {
19 #[must_use]
25 pub fn new(name: &'static str, list: OwnedMutPtr<Vec<T>>) -> Self {
26 Self {
27 name: Cow::from(name),
28 list,
29 }
30 }
31
32 #[must_use]
34 pub fn list(&self) -> &Vec<T> {
35 self.list.as_ref()
36 }
37
38 #[must_use]
40 pub fn list_mut(&mut self) -> &mut Vec<T> {
41 self.list.as_mut()
42 }
43}
44
45impl<I, S, T> Observer<I, S> for ListObserver<T> {
46 fn pre_exec(&mut self, _state: &mut S, _input: &I) -> Result<(), Error> {
47 self.list.as_mut().clear();
48 Ok(())
49 }
50}
51
52impl<T> Named for ListObserver<T> {
53 fn name(&self) -> &Cow<'static, str> {
54 &self.name
55 }
56}