Skip to content
Merged
13 changes: 13 additions & 0 deletions src/future/future/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ cfg_unstable! {
use try_race::TryRace;
use join::Join;
use try_join::TryJoin;
use crate::future::timeout::TimeoutFuture;
}

extension_trait! {
Expand Down Expand Up @@ -355,6 +356,18 @@ extension_trait! {
{
TryJoin::new(self, other)
}

#[doc = r#"
Waits for both the future and a timeout, if the timeout completes before
the future, it returns an TimeoutError.
"#]
#[cfg(any(feature = "unstable", feature = "docs"))]
#[cfg_attr(feature = "docs", doc(cfg(unstable)))]
fn timeout<F, T>(self, dur: Duration) -> impl Future<Output = Self::Output> [TimeoutFuture<Self>]
where Self: Sized
{
TimeoutFuture::new(self, dur)
}
}

impl<F: Future + Unpin + ?Sized> Future for Box<F> {
Expand Down
8 changes: 7 additions & 1 deletion src/future/timeout.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,14 +42,20 @@ where

pin_project! {
/// A future that times out after a duration of time.
struct TimeoutFuture<F> {
pub struct TimeoutFuture<F> {
#[pin]
future: F,
#[pin]
delay: Delay,
}
}

impl<F> TimeoutFuture<F> {
pub fn new(future: F, dur: Duration) -> TimeoutFuture<F> {
TimeoutFuture { future: future, delay: Delay::new(dur) }
}
}

impl<F: Future> Future for TimeoutFuture<F> {
type Output = Result<F::Output, TimeoutError>;

Expand Down