1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
use super::{BoxError, BoxFuture, Future, Request, Response, StdError}; use crate::router::OwnedCaptures; pub trait Handler { fn call(&self, req: Request, params: OwnedCaptures) -> BoxFuture<'static, Result<Response, BoxError>>; } pub type BoxHandler = Box<dyn Handler + Send + Sync>; impl Handler for BoxHandler { fn call(&self, req: Request, params: OwnedCaptures) -> BoxFuture<'static, Result<Response, BoxError>> { Handler::call(&**self, req, params) } } impl<F, E, Fut> Handler for F where F: Fn(Request, OwnedCaptures) -> Fut, E: StdError + Send + Sync + 'static, Fut: Future<Output = Result<Response, E>> + Send + 'static, { fn call(&self, req: Request, params: OwnedCaptures) -> BoxFuture<'static, Result<Response, BoxError>> { let fut = (self)(req, params); Box::pin(async move { let ret = fut.await; match ret { Ok(r) => Ok(r), Err(e) => Err(Box::new(e) as BoxError), } }) } }