#[macro_export]
macro_rules! with_filter {
($registry:expr, $filter_name:expr, $filter_type:ty, $operation:expr) => {
match $registry.get_filter($filter_name).await {
Ok(filter) => {
let filter_any = filter.as_any();
if let Some(typed_filter) = filter_any.downcast_ref::<$filter_type>() {
$operation(typed_filter).await
} else {
Err(FilterError::Other(format!(
"Found filter '{}' but it is not a {}",
$filter_name,
stringify!($filter_type)
)))
}
}
Err(err) => Err(err),
}
};
}
#[macro_export]
macro_rules! with_filter_result {
($registry:expr, $filter_name:expr, $filter_type:ty, $operation:expr, $default:expr) => {{
match $registry.get_filter($filter_name).await {
Ok(filter_ref) => {
let filter_any = filter_ref.as_any();
if let Some(typed_filter) = filter_any.downcast_ref::<$filter_type>() {
$operation(typed_filter).await
} else {
Err(FilterError::Other(format!(
"Found filter '{}' but it is not a {}",
$filter_name,
stringify!($filter_type)
)))
}
}
Err(FilterError::NotFound(_)) => Ok($default),
Err(e) => Err(e),
}
}};
}
#[macro_export]
macro_rules! with_filter_void {
($registry:expr, $filter_name:expr, $filter_type:ty, $operation:expr) => {{
match $registry.get_filter($filter_name).await {
Ok(filter_ref) => {
let filter_any = filter_ref.as_any();
if let Some(typed_filter) = filter_any.downcast_ref::<$filter_type>() {
$operation(typed_filter).await;
} else {
tracing::warn!(
"Found filter '{}' but it is not a {}",
$filter_name,
stringify!($filter_type)
);
}
}
Err(FilterError::NotFound(_)) => {
tracing::debug!("Filter '{}' not found", $filter_name);
}
Err(e) => {
tracing::warn!("Error getting filter '{}': {:?}", $filter_name, e);
}
}
}};
}
#[macro_export]
macro_rules! with_filter_or {
($registry:expr, $filter_name:expr, $filter_type:ty, $operation:expr, $default:expr) => {{ $crate::with_filter_result!($registry, $filter_name, $filter_type, $operation, $default) }};
}