use topcoat_core::context::Cx;
use crate::{Body, Methods, Path, PathBuf, Route, RouteFuture, RouteId};
#[doc(hidden)]
pub trait ModuleRoute: Send + Sync + 'static {
fn id(&self) -> RouteId;
fn methods(&self) -> Methods<'_>;
fn module_path(&self) -> &'static str;
fn handle<'cx>(&'cx self, cx: &'cx Cx, body: Body) -> RouteFuture<'cx>;
}
impl<R: ModuleRoute + ?Sized> ModuleRoute for &'static R {
fn id(&self) -> RouteId {
(**self).id()
}
fn methods(&self) -> Methods<'_> {
(**self).methods()
}
fn module_path(&self) -> &'static str {
(**self).module_path()
}
fn handle<'cx>(&'cx self, cx: &'cx Cx, body: Body) -> RouteFuture<'cx> {
(**self).handle(cx, body)
}
}
#[cfg(feature = "discover")]
inventory::collect!(&'static dyn ModuleRoute);
pub(super) struct ResolvedRoute<R> {
route: R,
path: PathBuf,
}
impl<R: ModuleRoute> ResolvedRoute<R> {
pub(super) fn new(route: R, path: PathBuf) -> Self {
Self { route, path }
}
}
impl<R: ModuleRoute> Route for ResolvedRoute<R> {
fn id(&self) -> RouteId {
self.route.id()
}
fn methods(&self) -> Methods<'_> {
self.route.methods()
}
fn path(&self) -> &Path {
&self.path
}
fn handle<'cx>(&'cx self, cx: &'cx Cx, body: Body) -> RouteFuture<'cx> {
self.route.handle(cx, body)
}
}