Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RunTime/Execute/
RunWithTimeout.rs

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