use crate::{request::Request, responder::Responder, response::Response, Result};
use async_trait::async_trait;
use std::future::Future;
#[async_trait]
pub trait Handler: Send + Sync + 'static {
    async fn handle(&self, req: Request) -> Result<Response>;
}
#[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) -> Result<Response> {
        let builder = Response::default();
        Ok(self(req).await.response(builder))
    }
}