[−][src]Trait roa_core::Middleware
Middleware
There are two kinds of middleware, the one is functional middleware, the another is trait middleware.
Functional Middleware
A normal functional middleware is an async function with signature:
async fn(&mut Context, Next<'_>) -> Result
.
use roa_core::{Context, Next, Result, Middleware}; use std::future::Future; fn is_middleware<S>(middleware: impl for<'a> Middleware<'a, S>) { } async fn middleware(ctx: &mut Context, next: Next<'_>) -> Result { Ok(()) } is_middleware(middleware);
Trait Middleware
A trait middleware is an object implementing trait Middleware
.
use roa_core::{Middleware, Context, Next, Result, async_trait}; use async_std::sync::Arc; use std::time::Instant; fn is_middleware<S>(middleware: impl for<'a> Middleware<'a, S>) {} struct Logger; #[async_trait(?Send)] impl <'a> Middleware<'a, ()> for Logger { async fn handle(&'a self, ctx: &'a mut Context, next: Next<'a>) -> Result { let start = Instant::now(); let result = next.await; println!("time elapsed: {}ms", start.elapsed().as_millis()); result } } is_middleware(Logger);
Required methods
#[must_use]fn handle<'async_trait>(
&'a self,
ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
&'a self,
ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
Handle context and next, return status.
Implementations on Foreign Types
impl<'a, S> Middleware<'a, S> for ()
[src]
Fake middleware.
fn handle<'async_trait>(
&'a self,
_ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result<()>> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
[src]
&'a self,
_ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result<()>> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
Implementors
impl<'a, S> Middleware<'a, S> for Shared<S> where
S: 'static,
[src]
S: 'static,
fn handle<'async_trait>(
&'a self,
ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
[src]
&'a self,
ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
impl<'a, S, T, F> Middleware<'a, S> for T where
S: 'a,
T: 'static + Send + Sync + Fn(&'a mut Context<S>, Next<'a>) -> F,
F: 'a + Future<Output = Result>,
[src]
S: 'a,
T: 'static + Send + Sync + Fn(&'a mut Context<S>, Next<'a>) -> F,
F: 'a + Future<Output = Result>,
fn handle<'async_trait>(
&'a self,
ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
[src]
&'a self,
ctx: &'a mut Context<S>,
next: Next<'a>
) -> Pin<Box<dyn Future<Output = Result> + 'async_trait>> where
'a: 'async_trait,
Self: 'async_trait,
impl<'a, S, T, U> Middleware<'a, S> for Chain<T, U> where
U: Middleware<'a, S>,
T: for<'b> Middleware<'b, S>,
[src]
U: Middleware<'a, S>,
T: for<'b> Middleware<'b, S>,