logging_child_runner/
logging_child_runner.rs1use std::collections::HashMap;
2use std::path::{Path, PathBuf};
3use std::sync::{atomic::AtomicBool, Arc};
4
5use runkon_flow::engine::{ChildWorkflowContext, ChildWorkflowInput, ChildWorkflowRunner};
6use runkon_flow::engine_error::EngineError;
7use runkon_flow::traits::run_context::RunContext;
8use runkon_flow::types::{WorkflowExecConfig, WorkflowResult};
9use runkon_flow::CancellationToken;
10
11struct LoggingChildRunner;
13
14fn stub_result(run_id: &str, workflow_name: &str) -> WorkflowResult {
15 WorkflowResult {
16 workflow_run_id: run_id.to_string(),
17 workflow_name: workflow_name.to_string(),
18 all_succeeded: true,
19 total_duration_ms: 0,
20 extensions: Default::default(),
21 }
22}
23
24impl ChildWorkflowRunner for LoggingChildRunner {
25 fn execute_child(
26 &self,
27 workflow_name: &str,
28 parent_ctx: &ChildWorkflowContext,
29 params: ChildWorkflowInput,
30 ) -> Result<WorkflowResult, EngineError> {
31 println!(
32 "execute_child: workflow={} inputs={}",
33 workflow_name,
34 params.inputs.len()
35 );
36 Ok(stub_result(&parent_ctx.workflow_run_id, workflow_name))
37 }
38
39 fn resume_child(
40 &self,
41 workflow_run_id: &str,
42 _model: Option<&str>,
43 parent_ctx: &ChildWorkflowContext,
44 ) -> Result<WorkflowResult, EngineError> {
45 println!("resume_child: run_id={}", workflow_run_id);
46 Ok(stub_result(
47 workflow_run_id,
48 parent_ctx.run_ctx.workflow_name(),
49 ))
50 }
51
52 fn find_resumable_child(
53 &self,
54 _parent_run_id: &str,
55 _workflow_name: &str,
56 ) -> Result<Option<runkon_flow::types::WorkflowRun>, EngineError> {
57 Ok(None)
58 }
59}
60
61struct StubCtx(PathBuf);
62
63impl RunContext for StubCtx {
64 fn injected_variables(&self) -> HashMap<&'static str, String> {
65 HashMap::new()
66 }
67 fn working_dir(&self) -> &Path {
68 &self.0
69 }
70 fn working_dir_str(&self) -> String {
71 self.0.to_string_lossy().into_owned()
72 }
73 fn get(&self, _: &str) -> Option<String> {
74 None
75 }
76 fn run_id(&self) -> &str {
77 "parent-run-001"
78 }
79 fn workflow_name(&self) -> &str {
80 "parent-workflow"
81 }
82 fn parent_run_id(&self) -> Option<&str> {
83 None
84 }
85 fn shutdown(&self) -> Option<&Arc<AtomicBool>> {
86 None
87 }
88}
89
90fn main() {
91 let runner = LoggingChildRunner;
92 let ctx = Arc::new(StubCtx(std::env::temp_dir()));
93 let parent_ctx = ChildWorkflowContext::new(
94 Arc::clone(&ctx) as Arc<dyn RunContext>,
95 vec![],
96 "parent-run-001".into(),
97 None,
98 WorkflowExecConfig::default(),
99 HashMap::new(),
100 Arc::from(vec![]),
101 );
102 let params = ChildWorkflowInput {
103 inputs: HashMap::new(),
104 iteration: 0,
105 as_identity: None,
106 depth: 1,
107 parent_step_id: None,
108 cancellation: CancellationToken::new(),
109 };
110 let result = runner
111 .execute_child("child-workflow", &parent_ctx, params)
112 .expect("execute_child failed");
113 println!("succeeded: {}", result.all_succeeded);
114}