diff --git a/src/extract/connect_info.rs b/src/extract/connect_info.rs index 3b804900..761c8413 100644 --- a/src/extract/connect_info.rs +++ b/src/extract/connect_info.rs @@ -86,6 +86,7 @@ where type Error = Infallible; type Future = ResponseFuture; + #[inline] fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) } @@ -93,9 +94,7 @@ where fn call(&mut self, target: T) -> Self::Future { let connect_info = ConnectInfo(C::connect_info(target)); let svc = AddExtensionLayer::new(connect_info).layer(self.svc.clone()); - ResponseFuture { - future: ready(Ok(svc)), - } + ResponseFuture::new(ready(Ok(svc))) } } diff --git a/src/handler/into_service.rs b/src/handler/into_service.rs index 5588aa55..efc27aff 100644 --- a/src/handler/into_service.rs +++ b/src/handler/into_service.rs @@ -75,6 +75,6 @@ where let handler = self.handler.clone(); let future = Handler::call(handler, req).map(Ok::<_, Infallible> as _); - super::future::IntoServiceFuture { future } + super::future::IntoServiceFuture::new(future) } } diff --git a/src/macros.rs b/src/macros.rs index bba7ea31..a705e76c 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -12,7 +12,13 @@ macro_rules! opaque_future { pin_project_lite::pin_project! { $(#[$m])* pub struct $name<$($param),*> { - #[pin] pub(crate) future: $actual, + #[pin] future: $actual, + } + } + + impl<$($param),*> $name<$($param),*> { + pub(crate) fn new(future: $actual) -> Self { + Self { future } } } diff --git a/src/routing/future.rs b/src/routing/future.rs index c17c5798..7a71d79b 100644 --- a/src/routing/future.rs +++ b/src/routing/future.rs @@ -1,11 +1,12 @@ //! Future types. use crate::body::BoxBody; +use futures_util::future::Either; use http::{Request, Response}; use pin_project_lite::pin_project; use std::{ convert::Infallible, - future::Future, + future::{ready, Future}, pin::Pin, task::{Context, Poll}, }; @@ -23,15 +24,11 @@ opaque_future! { impl RouterFuture { pub(super) fn from_oneshot(future: Oneshot, Request>) -> Self { - Self { - future: futures_util::future::Either::Left(future), - } + Self::new(Either::Left(future)) } pub(super) fn from_response(response: Response) -> Self { - RouterFuture { - future: futures_util::future::Either::Right(std::future::ready(Ok(response))), - } + RouterFuture::new(Either::Right(ready(Ok(response)))) } } diff --git a/src/routing/mod.rs b/src/routing/mod.rs index a4ae77d4..f4f480d1 100644 --- a/src/routing/mod.rs +++ b/src/routing/mod.rs @@ -928,9 +928,7 @@ where .body(crate::body::empty()) .unwrap(); - MethodNotAllowedFuture { - future: ready(Ok(res)), - } + MethodNotAllowedFuture::new(ready(Ok(res))) } } @@ -1019,9 +1017,7 @@ where } fn call(&mut self, _target: T) -> Self::Future { - future::MakeRouteServiceFuture { - future: ready(Ok(self.service.clone())), - } + future::MakeRouteServiceFuture::new(ready(Ok(self.service.clone()))) } } @@ -1054,9 +1050,7 @@ impl Service> for Route { #[inline] fn call(&mut self, req: Request) -> Self::Future { - RouteFuture { - future: self.0.call(req), - } + RouteFuture::new(self.0.call(req)) } }