| //! [`Future`] types | |
| //! | |
| //! [`Future`]: std::future::Future | |
| use futures_core::ready; | |
| use pin_project_lite::pin_project; | |
| use std::{ | |
| future::Future, | |
| pin::Pin, | |
| task::{Context, Poll}, | |
| }; | |
| use tokio::sync::OwnedSemaphorePermit; | |
| pin_project! { | |
| /// Future for the [`ConcurrencyLimit`] service. | |
| /// | |
| /// [`ConcurrencyLimit`]: crate::limit::ConcurrencyLimit | |
| #[derive(Debug)] | |
| pub struct ResponseFuture<T> { | |
| #[pin] | |
| inner: T, | |
| // Keep this around so that it is dropped when the future completes | |
| _permit: OwnedSemaphorePermit, | |
| } | |
| } | |
| impl<T> ResponseFuture<T> { | |
| pub(crate) fn new(inner: T, _permit: OwnedSemaphorePermit) -> ResponseFuture<T> { | |
| ResponseFuture { inner, _permit } | |
| } | |
| } | |
| impl<F, T, E> Future for ResponseFuture<F> | |
| where | |
| F: Future<Output = Result<T, E>>, | |
| { | |
| type Output = Result<T, E>; | |
| fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> { | |
| Poll::Ready(ready!(self.project().inner.poll(cx))) | |
| } | |
| } |