@@ -5,9 +5,10 @@ use std::collections::HashMap;
55
66use futures_lite:: future:: block_on;
77use tucana:: aquila:: ActionExecutionRequest ;
8+ use tucana:: shared:: node_execution_result:: Result as TucanaNodeResult ;
89use tucana:: shared:: reference_value:: Target ;
910use tucana:: shared:: value:: Kind ;
10- use tucana:: shared:: { Struct , Value } ;
11+ use tucana:: shared:: { NodeExecutionResult as TucanaNodeExecutionResult , Struct , Value } ;
1112use uuid:: Uuid ;
1213
1314use crate :: handler:: argument:: { Argument , ParameterNode } ;
@@ -56,7 +57,7 @@ struct ExecutionResult {
5657}
5758
5859/// Result of executing exactly one compiled node.
59- struct NodeExecutionResult {
60+ struct NodeResult {
6061 signal : Signal ,
6162 frame_id : Option < u64 > ,
6263}
@@ -150,25 +151,24 @@ impl<'a> EngineExecutor<'a> {
150151 }
151152 }
152153
153- fn execute_single_node (
154- & self ,
155- node_idx : usize ,
156- value_store : & mut ValueStore ,
157- ) -> NodeExecutionResult {
154+ fn execute_single_node ( & self , node_idx : usize , value_store : & mut ValueStore ) -> NodeResult {
158155 let node = & self . flow . nodes [ node_idx] ;
159156 // InputType references resolve against the currently running node.
160157 value_store. set_current_node_id ( node. id ) ;
161158
162159 let frame_id = self . trace_enter ( node, value_store) ;
163160 let signal = match & node. execution_target {
164- NodeExecutionTarget :: Local => self . execute_local_node ( node, value_store, frame_id) ,
161+ NodeExecutionTarget :: Local => {
162+ let signal = self . execute_local_node ( node, value_store, frame_id) ;
163+ self . commit_result ( node. id , signal, value_store)
164+ }
165165 NodeExecutionTarget :: Remote { service } => {
166166 self . execute_remote_node ( node, service, value_store, frame_id)
167167 }
168168 } ;
169169 self . trace_exit ( frame_id, & signal, value_store) ;
170170
171- NodeExecutionResult { signal, frame_id }
171+ NodeResult { signal, frame_id }
172172 }
173173
174174 fn execute_local_node (
@@ -190,14 +190,11 @@ impl<'a> EngineExecutor<'a> {
190190
191191 let mut args = match self . build_args ( node, value_store, frame_id) {
192192 Ok ( args) => args,
193- Err ( err) => {
194- value_store. insert_error ( node. id , err. clone ( ) ) ;
195- return Signal :: Failure ( err) ;
196- }
193+ Err ( err) => return Signal :: Failure ( err) ,
197194 } ;
198195
199196 if let Some ( signal) = self . force_eager_args ( entry, & mut args, value_store, frame_id) {
200- return self . commit_result ( node . id , signal, value_store ) ;
197+ return signal;
201198 }
202199
203200 // Handler-owned runtime calls (for lazy args / callbacks) re-enter the same executor.
@@ -211,8 +208,7 @@ impl<'a> EngineExecutor<'a> {
211208 child_result. signal
212209 } ;
213210
214- let signal = ( entry. handler ) ( & args, value_store, & mut run) ;
215- self . commit_result ( node. id , signal, value_store)
211+ ( entry. handler ) ( & args, value_store, & mut run)
216212 }
217213
218214 fn execute_remote_node (
@@ -225,20 +221,21 @@ impl<'a> EngineExecutor<'a> {
225221 let remote_runtime = match self . remote {
226222 Some ( remote) => remote,
227223 None => {
228- return Signal :: Failure ( RuntimeError :: new (
229- "T-CORE-000003" ,
230- "RemoteRuntimeNotConfigured" ,
231- "Remote runtime not configured" ,
232- ) ) ;
224+ return self . commit_result (
225+ node. id ,
226+ Signal :: Failure ( RuntimeError :: new (
227+ "T-CORE-000003" ,
228+ "RemoteRuntimeNotConfigured" ,
229+ "Remote runtime not configured" ,
230+ ) ) ,
231+ value_store,
232+ ) ;
233233 }
234234 } ;
235235
236236 let mut args = match self . build_args ( node, value_store, frame_id) {
237237 Ok ( args) => args,
238- Err ( err) => {
239- value_store. insert_error ( node. id , err. clone ( ) ) ;
240- return Signal :: Failure ( err) ;
241- }
238+ Err ( err) => return self . commit_result ( node. id , Signal :: Failure ( err) , value_store) ,
242239 } ;
243240
244241 let values = match self . resolve_remote_args ( & mut args, value_store, frame_id) {
@@ -248,21 +245,16 @@ impl<'a> EngineExecutor<'a> {
248245
249246 let request = match self . build_remote_request ( node, values) {
250247 Ok ( request) => request,
251- Err ( err) => {
252- value_store. insert_error ( node. id , err. clone ( ) ) ;
253- return Signal :: Failure ( err) ;
254- }
248+ Err ( err) => return self . commit_result ( node. id , Signal :: Failure ( err) , value_store) ,
255249 } ;
256250
257- let signal = match block_on ( remote_runtime. execute_remote ( RemoteExecution {
251+ match block_on ( remote_runtime. execute_remote ( RemoteExecution {
258252 target_service : service. to_string ( ) ,
259253 request,
260254 } ) ) {
261- Ok ( value) => Signal :: Success ( value) ,
262- Err ( err) => Signal :: Failure ( err) ,
263- } ;
264-
265- self . commit_result ( node. id , signal, value_store)
255+ Ok ( result) => self . commit_remote_result ( node. id , result, value_store) ,
256+ Err ( err) => self . commit_result ( node. id , Signal :: Failure ( err) , value_store) ,
257+ }
266258 }
267259
268260 fn build_args (
@@ -522,6 +514,26 @@ impl<'a> EngineExecutor<'a> {
522514 }
523515 }
524516
517+ fn commit_remote_result (
518+ & self ,
519+ node_id : i64 ,
520+ result : TucanaNodeExecutionResult ,
521+ value_store : & mut ValueStore ,
522+ ) -> Signal {
523+ value_store. insert_node_result ( node_id, result. clone ( ) ) ;
524+ match result. result {
525+ Some ( TucanaNodeResult :: Success ( value) ) => Signal :: Success ( value) ,
526+ Some ( TucanaNodeResult :: Error ( error) ) => {
527+ Signal :: Failure ( RuntimeError :: from_tucana_error ( & error) )
528+ }
529+ None => Signal :: Failure ( RuntimeError :: new (
530+ "T-CORE-000006" ,
531+ "NodeExecutionResultMissingOutcome" ,
532+ "Remote node execution result is missing success/error outcome" ,
533+ ) ) ,
534+ }
535+ }
536+
525537 fn trace_enter ( & self , node : & CompiledNode , value_store : & ValueStore ) -> Option < u64 > {
526538 self . tracer . map ( |tracer| {
527539 tracer. borrow_mut ( ) . enter_node (
0 commit comments