1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use crate::{request::Request, responder::Responder, response::Builder};
use async_trait::async_trait;
use std::future::Future;

#[async_trait]
pub trait Handler: Send + Sync + 'static {
    async fn handle(&self, req: Request) -> Builder;
}

#[async_trait]
impl<R, Fut, F> Handler for F
where
    R: Responder + 'static + Send,
    Fut: Future<Output = R> + Send + 'static,
    F: Fn(Request) -> Fut + Sync + Send + 'static,
{
    #[inline]
    async fn handle(&self, req: Request) -> Builder {
        let builder = Builder::new();
        self(req).await.response(builder)
    }
}