DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RunTime/Execute/
RunWithRetry.rs1use 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, dev_log};
14
15impl ApplicationRunTime {
16 pub async fn RunWithRetry<TCapabilityProvider, TError, TOutput>(
17 &self,
18
19 Effect:ActionEffect<Arc<TCapabilityProvider>, TError, TOutput>,
20
21 MaximumRetries:u32,
22
23 InitialDelay: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 + std::fmt::Display,
30 TOutput: Send + Sync + 'static, {
31 let mut RetryCount = 0;
32
33 let mut CurrentDelay = InitialDelay;
34
35 while RetryCount <= MaximumRetries {
36 match ApplicationRunTimeTrait::Run(self, Effect.clone()).await {
37 Ok(Result) => return Ok(Result),
38
39 Err(Error) => {
40 if RetryCount == MaximumRetries {
41 return Err(Error);
42 }
43
44 RetryCount += 1;
45
46 dev_log!(
47 "lifecycle",
48 "warn: [ApplicationRunTime] Effect execution failed (attempt {}): {}. Retrying in {:?}...",
49 RetryCount,
50 Error,
51 CurrentDelay
52 );
53
54 tokio::time::sleep(CurrentDelay).await;
55
56 CurrentDelay *= 2;
57 },
58 }
59 }
60
61 Err(
62 CommonError::Unknown { Description:format!("Effect execution failed after {} retries", MaximumRetries) }
63 .into(),
64 )
65 }
66}