use alloc::boxed::Box;
use core::any::type_name;
#[cfg(feature = "nautilus")]
pub mod nautilus;
use libafl_bolts::{
Error,
serdeany::{NamedSerdeAnyMap, SerdeAny, SerdeAnyMap},
};
pub trait HasMetadata {
fn metadata_map(&self) -> &SerdeAnyMap;
fn metadata_map_mut(&mut self) -> &mut SerdeAnyMap;
#[inline]
fn add_metadata<M>(&mut self, meta: M)
where
M: SerdeAny,
{
self.metadata_map_mut().insert(meta);
}
#[inline]
fn try_add_metadata<M>(&mut self, meta: M) -> Result<(), Error>
where
M: SerdeAny,
{
self.metadata_map_mut().try_insert(meta)
}
fn metadata_or_insert_with<M>(&mut self, default: impl FnOnce() -> M) -> &mut M
where
M: SerdeAny,
{
self.metadata_map_mut().get_or_insert_with::<M>(default)
}
#[inline]
fn remove_metadata<M>(&mut self) -> Option<Box<M>>
where
M: SerdeAny,
{
self.metadata_map_mut().remove::<M>()
}
#[inline]
fn has_metadata<M>(&self) -> bool
where
M: SerdeAny,
{
self.metadata_map().get::<M>().is_some()
}
#[inline]
fn metadata<M>(&self) -> Result<&M, Error>
where
M: SerdeAny,
{
self.metadata_map()
.get::<M>()
.ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::<M>())))
}
#[inline]
fn metadata_mut<M>(&mut self) -> Result<&mut M, Error>
where
M: SerdeAny,
{
self.metadata_map_mut()
.get_mut::<M>()
.ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::<M>())))
}
}
pub trait HasNamedMetadata {
fn named_metadata_map(&self) -> &NamedSerdeAnyMap;
fn named_metadata_map_mut(&mut self) -> &mut NamedSerdeAnyMap;
#[inline]
fn add_named_metadata<M>(&mut self, name: &str, meta: M)
where
M: SerdeAny,
{
self.named_metadata_map_mut().insert(name, meta);
}
#[inline]
fn add_named_metadata_checked<M>(&mut self, name: &str, meta: M) -> Result<(), Error>
where
M: SerdeAny,
{
self.named_metadata_map_mut().try_insert(name, meta)
}
#[inline]
fn remove_named_metadata<M>(&mut self, name: &str) -> Option<Box<M>>
where
M: SerdeAny,
{
self.named_metadata_map_mut().remove::<M>(name)
}
fn named_metadata_or_insert_with<M>(
&mut self,
name: &str,
default: impl FnOnce() -> M,
) -> &mut M
where
M: SerdeAny,
{
self.named_metadata_map_mut()
.get_or_insert_with::<M>(name, default)
}
#[inline]
fn has_named_metadata<M>(&self, name: &str) -> bool
where
M: SerdeAny,
{
self.named_metadata_map().contains::<M>(name)
}
#[inline]
fn named_metadata<M>(&self, name: &str) -> Result<&M, Error>
where
M: SerdeAny,
{
self.named_metadata_map()
.get::<M>(name)
.ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::<M>())))
}
#[inline]
fn named_metadata_mut<M>(&mut self, name: &str) -> Result<&mut M, Error>
where
M: SerdeAny,
{
self.named_metadata_map_mut()
.get_mut::<M>(name)
.ok_or_else(|| Error::key_not_found(format!("{} not found", type_name::<M>())))
}
}