use std::{fmt::Debug, future::Future, pin::Pin}; use crate::{ context::{Context, DefaultContext}, error::{DefaultError, Error}, }; pub type NextHandler = Box< dyn Fn( TContext, ) -> Pin< Box< dyn Future>> + Send, >, > + Send + Sync, >; #[async_trait::async_trait] pub trait Middleware where TContext: Context + Debug + Send + Sync, TErrorData: Default + Send + Sync, { async fn run_middleware( &self, context: TContext, next: NextHandler, ) -> Result>; } type DefaultMiddlewareHandler = fn( DefaultContext, NextHandler, ) -> Pin< Box> + Send>, >; #[derive(Clone)] pub struct DefaultMiddleware where TData: Default + Clone + Send + Sync, { handler: DefaultMiddlewareHandler, #[allow(dead_code)] data: TData, } impl DefaultMiddleware where TData: Default + Clone + Send + Sync, { pub fn new(handler: DefaultMiddlewareHandler) -> Self { DefaultMiddleware { handler, data: Default::default(), } } pub fn new_with_data( handler: DefaultMiddlewareHandler, data: TData, ) -> Self { DefaultMiddleware { handler, data } } } #[async_trait::async_trait] impl Middleware for DefaultMiddleware where TData: Default + Clone + Send + Sync, { async fn run_middleware( &self, context: DefaultContext, next: NextHandler, ) -> Result { (self.handler)(context, next).await } }