Skip to main content

logging_child_runner/
logging_child_runner.rs

1use 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
11/// `ChildWorkflowRunner` that logs each call and returns a stub result.
12struct 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}