use std::any::Any;
use super::{Processor, ProcessorHooks};
use crate::metadata::AsAny;
use crate::observers::Observers;
use crate::requests::Request;
use crate::state::SharedState;
use crate::std_ext::tuple::Named;
use crate::{actions::Action, responses::Response};
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use tracing::instrument;
#[derive(Clone, Default, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[allow(clippy::derive_partial_eq_without_eq)] pub struct RequestProcessor<F>
where
F: Fn(&mut Request, Option<&Action>, &SharedState) + 'static,
{
processor: F,
}
impl<F> RequestProcessor<F>
where
F: Fn(&mut Request, Option<&Action>, &SharedState) + 'static,
{
pub const fn new(processor: F) -> Self {
Self { processor }
}
}
impl<F> Processor for RequestProcessor<F> where
F: Fn(&mut Request, Option<&Action>, &SharedState) + Sync + Send + Clone + 'static
{
}
impl<F, O, R> ProcessorHooks<O, R> for RequestProcessor<F>
where
F: Fn(&mut Request, Option<&Action>, &SharedState) + Sync + Send + Clone + 'static,
O: Observers<R>,
R: Response,
{
#[instrument(skip_all, fields(?action), level = "trace")]
fn pre_send_hook(
&mut self,
state: &SharedState,
request: &mut Request,
action: Option<&Action>,
) {
(self.processor)(request, action, state);
}
}
impl<F> Named for RequestProcessor<F>
where
F: Fn(&mut Request, Option<&Action>, &SharedState) + 'static,
{
fn name(&self) -> &str {
"RequestProcessor"
}
}
impl<F> AsAny for RequestProcessor<F>
where
F: Fn(&mut Request, Option<&Action>, &SharedState) + 'static,
{
fn as_any(&self) -> &dyn Any {
self
}
}