use crate::{Request, Response};
use async_trait::async_trait;
use std::future::Future;
use std::pin::Pin;
pub type BoxFuture<T> = Pin<Box<dyn Future<Output = T> + Send + 'static>>;
#[async_trait]
pub trait Handler: Send + Sync + 'static {
async fn handle(&self, req: Request) -> Result<Response, Box<dyn std::error::Error + Send + Sync>>;
}
#[async_trait]
impl<F, Fut> Handler for F
where
F: Fn(Request) -> Fut + Send + Sync + 'static,
Fut: Future<Output = Result<Response, Box<dyn std::error::Error + Send + Sync>>> + Send + 'static,
{
async fn handle(&self, req: Request) -> Result<Response, Box<dyn std::error::Error + Send + Sync>> {
self(req).await
}
}