use std::future::Future;
use tokio::task::JoinHandle;
pub enum TaskTimeoutResult<Result>
where Result: Send {
Timeout,
Completed(Result)
}
pub async fn execute_until_timeout<Task, Duration>(task: Task, duration: Duration) -> TaskTimeoutResult<Task::Output>
where Task: Future,
Task::Output: Send,
Duration: Into<std::time::Duration>,
{
let timeout = tokio::time::sleep(duration.into());
tokio::select! {
_ = timeout => {
TaskTimeoutResult::Timeout
},
r = task => {
TaskTimeoutResult::Completed(r)
}
}
}
pub async fn execute_task_until_timeout<Task, Duration>(task: Task, duration: Duration) -> JoinHandle<TaskTimeoutResult<Task::Output>>
where Task: Future + Send + 'static,
Task::Output: Send,
Duration: Into<std::time::Duration>,
{
let timeout = tokio::time::sleep(duration.into());
let f = async {
tokio::select! {
_ = timeout => {
TaskTimeoutResult::Timeout
},
r = task => {
TaskTimeoutResult::Completed(r)
}
}
};
tokio::task::spawn(f)
}