Skip to main content

stdout_event_sink/
stdout_event_sink.rs

1use runkon_flow::events::{EngineEvent, EngineEventData, EventSink};
2use runkon_flow::FlowEngineBuilder;
3
4/// `EventSink` that prints a summary of each engine event to stdout.
5struct StdoutEventSink;
6
7impl EventSink for StdoutEventSink {
8    fn emit(&self, event: &EngineEventData) {
9        let summary = match &event.event {
10            EngineEvent::RunStarted { workflow_name } => {
11                format!("run started (workflow={})", workflow_name)
12            }
13            EngineEvent::RunCompleted { succeeded } => {
14                format!("run completed (succeeded={})", succeeded)
15            }
16            EngineEvent::StepStarted { step_name } => {
17                format!("step started (step={})", step_name)
18            }
19            EngineEvent::StepCompleted {
20                step_name,
21                succeeded,
22            } => {
23                format!(
24                    "step completed (step={}, succeeded={})",
25                    step_name, succeeded
26                )
27            }
28            _ => format!("{:?}", event.event),
29        };
30        println!("[{}] run={} {}", event.timestamp, event.run_id, summary);
31    }
32}
33
34fn main() {
35    let sink = StdoutEventSink;
36
37    sink.emit(&EngineEventData::new(
38        "run-001".into(),
39        EngineEvent::RunStarted {
40            workflow_name: "my-workflow".into(),
41        },
42    ));
43    sink.emit(&EngineEventData::new(
44        "run-001".into(),
45        EngineEvent::RunCompleted { succeeded: true },
46    ));
47
48    // Wire it into a FlowEngine (builder shown; engine not actually run here):
49    let _engine = FlowEngineBuilder::new()
50        .event_sink(Box::new(StdoutEventSink))
51        .build()
52        .expect("engine build failed");
53    println!("engine built with StdoutEventSink attached");
54}