DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RunTime/Execute/
Run.rs1use std::sync::Arc;
5
6use CommonLibrary::{
7 Effect::{ActionEffect::ActionEffect, ApplicationRunTime::ApplicationRunTime as ApplicationRunTimeTrait},
8 Environment::Requires::Requires,
9 Error::CommonError::CommonError,
10};
11use Echo::Task::Priority::Priority;
12use async_trait::async_trait;
13
14use crate::{RunTime::ApplicationRunTime::ApplicationRunTime, dev_log};
15
16#[async_trait]
17impl ApplicationRunTimeTrait for ApplicationRunTime {
18 async fn Run<TCapabilityProvider, TError, TOutput>(
19 &self,
20
21 Effect:ActionEffect<Arc<TCapabilityProvider>, TError, TOutput>,
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 let (ResultSender, ResultReceiver) = tokio::sync::oneshot::channel::<Result<TOutput, TError>>();
30
31 let CapabilityProvider:Arc<TCapabilityProvider> = self.Environment.Require();
32
33 let Task = async move {
34 let Result = Effect.Apply(CapabilityProvider).await;
35
36 if ResultSender.send(Result).is_err() {
37 dev_log!(
38 "lifecycle",
39 "error: [ApplicationRunTime] Failed to send effect result; receiver was dropped."
40 );
41 }
42 };
43
44 self.Scheduler.Submit(Task, Priority::Normal);
45
46 match ResultReceiver.await {
47 Ok(Result) => Result,
48
49 Err(_) => {
50 let Message = "Effect execution canceled; oneshot channel closed.".to_string();
51
52 dev_log!("lifecycle", "error: {}", Message);
53
54 Err(CommonError::IPCError { Description:Message }.into())
55 },
56 }
57 }
58}