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),
            }
        })
    }
}