Skip to main content

bpm_engine_runtime/
pump.rs

1//! Event pump: run_async(initial_event, ctx) -> loop dispatch to handlers (design: handler.md ยง9).
2
3use std::collections::VecDeque;
4
5use super::handler::{EngineContext, EventHandler};
6use bpm_engine_core::EngineEvent;
7use tracing::debug;
8
9pub struct EventPump;
10
11impl EventPump {
12    /// Run until queue is empty: pop event, dispatch to all handlers, push new events.
13    pub async fn run_async(
14        handlers: &[Box<dyn EventHandler>],
15        initial: EngineEvent,
16        ctx: &mut EngineContext,
17    ) {
18        let mut queue: VecDeque<EngineEvent> = VecDeque::new();
19        queue.push_back(initial);
20
21        while let Some(event) = queue.pop_front() {
22            debug!(event = ?event, "event pump dispatch");
23            for handler in handlers {
24                let new_events = handler.handle(&event, ctx).await;
25                queue.extend(new_events);
26            }
27        }
28    }
29}