use std::any::Any;
use super::{Ordering, Processor, ProcessorHooks};
use crate::actions::Action;
use crate::metadata::AsAny;
use crate::observers::Observers;
use crate::requests::Request;
use crate::responses::Response;
use crate::state::SharedState;
use crate::statistics::Statistics;
use crate::std_ext::tuple::Named;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
use tracing::instrument;
use std::sync::{Arc, RwLock};
#[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 StatisticsProcessor<F>
where
F: Fn(Arc<RwLock<Statistics>>, Option<&Action>, &SharedState) + 'static,
{
processor: F,
ordering: Ordering,
}
impl<F> StatisticsProcessor<F>
where
F: Fn(Arc<RwLock<Statistics>>, Option<&Action>, &SharedState) + 'static,
{
pub const fn new(ordering: Ordering, processor: F) -> Self {
Self {
processor,
ordering,
}
}
}
impl<F> Processor for StatisticsProcessor<F> where
F: Fn(Arc<RwLock<Statistics>>, Option<&Action>, &SharedState) + Sync + Send + Clone + 'static
{
}
impl<F, O, R> ProcessorHooks<O, R> for StatisticsProcessor<F>
where
F: Fn(Arc<RwLock<Statistics>>, Option<&Action>, &SharedState) + Sync + Send + Clone + 'static,
O: Observers<R>,
R: Response,
{
#[instrument(skip_all, fields(?self.ordering, ?action), level = "trace")]
fn pre_send_hook(
&mut self,
state: &SharedState,
_request: &mut Request,
action: Option<&Action>,
) {
match self.ordering {
Ordering::PreSend | Ordering::PreAndPostSend => {
(self.processor)(state.stats(), action, state);
}
Ordering::PostSend => {}
}
}
#[instrument(skip_all, fields(?self.ordering, ?action), level = "trace")]
fn post_send_hook(&mut self, state: &SharedState, _observers: &O, action: Option<&Action>) {
match self.ordering {
Ordering::PostSend | Ordering::PreAndPostSend => {
(self.processor)(state.stats(), action, state);
}
Ordering::PreSend => {}
}
}
}
impl<F> Named for StatisticsProcessor<F>
where
F: Fn(Arc<RwLock<Statistics>>, Option<&Action>, &SharedState) + 'static,
{
fn name(&self) -> &'static str {
"StatisticsProcessor"
}
}
impl<F> AsAny for StatisticsProcessor<F>
where
F: Fn(Arc<RwLock<Statistics>>, Option<&Action>, &SharedState) + 'static,
{
fn as_any(&self) -> &dyn Any {
self
}
}