diff --git a/tokio-util/src/time/mod.rs b/tokio-util/src/time/mod.rs index 2d340083604..06d4bd2697e 100644 --- a/tokio-util/src/time/mod.rs +++ b/tokio-util/src/time/mod.rs @@ -8,7 +8,9 @@ //! //! This type must be used from within the context of the `Runtime`. +use futures_core::Future; use std::time::Duration; +use tokio::time::Timeout; mod wheel; @@ -17,6 +19,34 @@ pub mod delay_queue; #[doc(inline)] pub use delay_queue::DelayQueue; +/// A trait which contains a variety of convenient adapters and utilities for `Future`s. +pub trait FutureExt: Future { + /// A wrapper around [`tokio::time::timeout`], with the advantage that it is easier to write + /// fluent call chains. + /// + /// # Examples + /// + /// ```rust + /// use tokio::{sync::oneshot, time::Duration}; + /// use tokio_util::time::FutureExt; + /// + /// # async fn dox() { + /// let (tx, rx) = oneshot::channel::<()>(); + /// + /// let res = rx.timeout(Duration::from_millis(10)).await; + /// assert!(res.is_err()); + /// # } + /// ``` + fn timeout(self, timeout: Duration) -> Timeout + where + Self: Sized, + { + tokio::time::timeout(timeout, self) + } +} + +impl FutureExt for T {} + // ===== Internal utils ===== enum Round {