use futures::future::{Future, FutureObj};
use crate::{response::IntoResponse, Context, Response};
pub trait Endpoint<AppData>: Send + Sync + 'static {
type Fut: Future<Output = Response> + Send + 'static;
fn call(&self, cx: Context<AppData>) -> Self::Fut;
}
pub(crate) type DynEndpoint<AppData> =
dyn (Fn(Context<AppData>) -> FutureObj<'static, Response>) + 'static + Send + Sync;
impl<AppData, F: Send + Sync + 'static, Fut> Endpoint<AppData> for F
where
F: Fn(Context<AppData>) -> Fut,
Fut: Future + Send + 'static,
Fut::Output: IntoResponse,
{
type Fut = FutureObj<'static, Response>;
fn call(&self, cx: Context<AppData>) -> Self::Fut {
let fut = (self)(cx);
box_async! {
await!(fut).into_response()
}
}
}