Skip to main content

Mountain/RunTime/Execute/
RunWithTimeout.rs

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