use crate::handler::HandlerFuture;
use crate::middleware::{Middleware, NewMiddleware};
use crate::state::{State, StateData};
use std::panic::RefUnwindSafe;
use std::pin::Pin;
#[derive(Clone)]
pub struct StateMiddleware<T>
where
T: Clone + RefUnwindSafe + StateData + Sync,
{
t: T,
}
impl<T> StateMiddleware<T>
where
T: Clone + RefUnwindSafe + StateData + Sync,
{
pub fn new(t: T) -> Self {
Self { t }
}
}
impl<T> Middleware for StateMiddleware<T>
where
T: Clone + RefUnwindSafe + StateData + Sync,
{
fn call<Chain>(self, mut state: State, chain: Chain) -> Pin<Box<HandlerFuture>>
where
Chain: FnOnce(State) -> Pin<Box<HandlerFuture>>,
{
state.put(self.t);
chain(state)
}
}
impl<T> NewMiddleware for StateMiddleware<T>
where
T: Clone + RefUnwindSafe + StateData + Sync,
{
type Instance = Self;
fn new_middleware(&self) -> anyhow::Result<Self::Instance> {
Ok(self.clone())
}
}