Skip to main content

Mountain/RunTime/Execute/
RunWithTimeout.rs

1#![allow(non_snake_case)]
2
3//! Cancel an effect that exceeds a wall-clock budget. Wraps `Run` in
4//! `tokio::time::timeout` and converts the elapsed-error into
5//! `CommonError::Unknown`.
6
7use std::sync::Arc;
8
9use CommonLibrary::{
10	Effect::{ActionEffect::ActionEffect, ApplicationRunTime::ApplicationRunTime as ApplicationRunTimeTrait},
11	Environment::Requires::Requires,
12	Error::CommonError::CommonError,
13};
14
15use crate::RunTime::ApplicationRunTime::ApplicationRunTime;
16
17impl ApplicationRunTime {
18	pub async fn RunWithTimeout<TCapabilityProvider, TError, TOutput>(
19		&self,
20
21		Effect:ActionEffect<Arc<TCapabilityProvider>, TError, TOutput>,
22
23		Timeout:std::time::Duration,
24	) -> Result<TOutput, TError>
25	where
26		TCapabilityProvider: ?Sized + Send + Sync + 'static,
27		<Self as CommonLibrary::Environment::HasEnvironment::HasEnvironment>::EnvironmentType:
28			Requires<TCapabilityProvider>,
29		TError: From<CommonError> + Send + Sync + 'static,
30		TOutput: Send + Sync + 'static, {
31		tokio::time::timeout(Timeout, ApplicationRunTimeTrait::Run(self, Effect))
32			.await
33			.map_err(|_| {
34				CommonError::Unknown { Description:format!("Effect execution timed out after {:?}", Timeout) }.into()
35			})?
36	}
37}