tokio-timeout 0.1.1

A proc-macro which adds a timeout to an asynchronous function running under the tokio runtime
Documentation
use std::time::Duration;
use tokio_timeout::timeout;

#[timeout(duration = "1m10s", on_error = "panic")]
pub async fn my_panic_fn() {}

pub enum MyErr {
    Timeout(&'static str),
}

fn my_err(msg: &'static str) -> Result<String, MyErr> {
    Err(MyErr::Timeout(msg))
}

#[timeout(duration = "5ms", on_error = my_err)]
pub async fn my_res_fn() -> Result<String, MyErr> {
    Ok(String::new())
}

#[timeout(duration = "1ms", on_error = my_err)]
pub async fn my_will_time_out_fn() -> Result<String, MyErr> {
    tokio::time::sleep(core::time::Duration::from_millis(1000)).await;
    Ok(String::new())
}

const MY_DUR: Duration = Duration::from_millis(1);

#[timeout(duration = crate::MY_DUR, on_error = my_err)]
pub async fn my_will_time_out_const() -> Result<String, MyErr> {
    tokio::time::sleep(core::time::Duration::from_millis(1000)).await;
    Ok(String::new())
}

pub struct StructWithTimeoutImpl;

impl StructWithTimeoutImpl {
    #[timeout(duration = "1ms", on_error = "panic")]
    pub async fn static_timeout_method() {}

    #[timeout(duration = "5ms", on_error = "panic")]
    pub async fn with_self_timeout_method(&self) {}

    #[timeout(duration = "5ms", on_error = "panic")]
    pub async fn with_generics_timeout_method<T, R>(&self, _t: T, _r: R) {}
}

#[tokio::test]
async fn smoke_times_out() {
    let err = my_will_time_out_fn().await.err().unwrap();
    assert!(matches!(err, MyErr::Timeout(_)));
}