diff --git a/src/lib.rs b/src/lib.rs index 93b6ac90..24b08674 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -216,11 +216,21 @@ impl From for Error { } } -// TODO(david): make this trait sealed +mod sealed { + pub trait HiddentTrait {} + pub struct Hidden; + impl HiddentTrait for Hidden {} +} + #[async_trait] pub trait Handler: Sized { type ResponseBody; + // This seals the trait. We cannot use the regular "sealed super trait" approach + // due to coherence. + #[doc(hidden)] + type Sealed: sealed::HiddentTrait; + async fn call(self, req: Request) -> Result, Error>; fn layer(self, layer: L) -> Layered @@ -239,6 +249,8 @@ where { type ResponseBody = B; + type Sealed = sealed::Hidden; + async fn call(self, req: Request) -> Result, Error> { self(req).await } @@ -256,6 +268,8 @@ macro_rules! impl_handler { { type ResponseBody = B; + type Sealed = sealed::Hidden; + async fn call(self, mut req: Request) -> Result, Error> { let $head = $head::from_request(&mut req).await?; let res = self(req, $head).await?; @@ -276,6 +290,8 @@ macro_rules! impl_handler { { type ResponseBody = B; + type Sealed = sealed::Hidden; + async fn call(self, mut req: Request) -> Result, Error> { let $head = $head::from_request(&mut req).await?; $( @@ -315,6 +331,8 @@ where { type ResponseBody = B; + type Sealed = sealed::Hidden; + async fn call(self, req: Request) -> Result, Error> { self.svc .oneshot(req)