| //! Handler future types. |
| |
| use crate::response::Response; |
| use futures_util::future::Map; |
| use http::Request; |
| use pin_project_lite::pin_project; |
| use std::{convert::Infallible, future::Future, pin::Pin, task::Context}; |
| use tower::util::Oneshot; |
| use tower_service::Service; |
| |
| opaque_future! { |
| /// The response future for [`IntoService`](super::IntoService). |
| pub type IntoServiceFuture<F> = |
| Map< |
| F, |
| fn(Response) -> Result<Response, Infallible>, |
| >; |
| } |
| |
| pin_project! { |
| /// The response future for [`Layered`](super::Layered). |
| pub struct LayeredFuture<B, S> |
| where |
| S: Service<Request<B>>, |
| { |
| #[pin] |
| inner: Map<Oneshot<S, Request<B>>, fn(Result<S::Response, S::Error>) -> Response>, |
| } |
| } |
| |
| impl<B, S> LayeredFuture<B, S> |
| where |
| S: Service<Request<B>>, |
| { |
| pub(super) fn new( |
| inner: Map<Oneshot<S, Request<B>>, fn(Result<S::Response, S::Error>) -> Response>, |
| ) -> Self { |
| Self { inner } |
| } |
| } |
| |
| impl<B, S> Future for LayeredFuture<B, S> |
| where |
| S: Service<Request<B>>, |
| { |
| type Output = Response; |
| |
| #[inline] |
| fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> std::task::Poll<Self::Output> { |
| self.project().inner.poll(cx) |
| } |
| } |