Skip to main content

DevelopmentNodeEnvironment_MicrosoftVSCodeDependency_22NodeVersion_Bundle_Clean_Debug_ElectronProfile_EsbuildCompiler_Mountain/RunTime/Execute/
Run.rs

1//! `ApplicationRunTimeTrait::Run` - submit an `ActionEffect` to the Echo
2//! work-stealing scheduler and block on the oneshot reply.
3
4use 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}