mf_core/helpers/
event_helper.rs

1//! 事件管理辅助模块
2//!
3//! 提供统一的事件管理逻辑,包括:
4//! - 事件总线初始化
5//! - 事件广播
6//! - 事件处理器注册
7//! - 事件循环管理
8
9use crate::{
10    config::ForgeConfig,
11    debug::debug,
12    error::{error_utils, ForgeResult},
13    event::{Event, EventBus},
14    metrics,
15    types::RuntimeOptions,
16};
17use mf_state::state::State;
18use std::sync::Arc;
19
20/// 事件管理辅助器
21pub struct EventHelper;
22
23impl EventHelper {
24    /// 创建并初始化事件总线
25    ///
26    /// # 参数
27    /// * `config` - Forge配置
28    /// * `runtime_options` - 运行时选项
29    /// * `state` - 初始状态
30    ///
31    /// # 返回值
32    /// * `ForgeResult<EventBus<Event>>` - 已初始化的事件总线或错误
33    pub async fn create_and_init_event_bus(
34        config: &ForgeConfig,
35        runtime_options: &RuntimeOptions,
36        state: Arc<State>,
37    ) -> ForgeResult<EventBus<Event>> {
38        let event_bus = EventBus::with_config(config.event.clone());
39        debug!("已创建事件总线");
40
41        // 注册事件处理器
42        let handlers = runtime_options.get_event_handlers();
43        event_bus.add_event_handlers(handlers)?;
44
45        // 启动事件循环
46        event_bus.start_event_loop();
47        debug!("事件总线已启动");
48
49        // 广播创建事件
50        event_bus.broadcast_blocking(Event::Create(state)).map_err(|e| {
51            error_utils::event_error(format!("广播 Create 事件失败: {e}"))
52        })?;
53
54        Ok(event_bus)
55    }
56
57    /// 广播事件(异步)
58    ///
59    /// # 参数
60    /// * `event_bus` - 事件总线的可变引用
61    /// * `event` - 要广播的事件
62    ///
63    /// # 返回值
64    /// * `ForgeResult<()>` - 成功或错误
65    pub async fn emit_event(
66        event_bus: &mut EventBus<Event>,
67        event: Event,
68    ) -> ForgeResult<()> {
69        metrics::event_emitted(event.name());
70        event_bus.broadcast(event).await?;
71        Ok(())
72    }
73
74    /// 广播事件(同步阻塞)
75    ///
76    /// # 参数
77    /// * `event_bus` - 事件总线的可变引用
78    /// * `event` - 要广播的事件
79    ///
80    /// # 返回值
81    /// * `ForgeResult<()>` - 成功或错误
82    pub fn emit_event_blocking(
83        event_bus: &mut EventBus<Event>,
84        event: Event,
85    ) -> ForgeResult<()> {
86        metrics::event_emitted(event.name());
87        event_bus.broadcast_blocking(event)?;
88        Ok(())
89    }
90
91    /// 销毁事件总线(异步)
92    ///
93    /// # 参数
94    /// * `event_bus` - 事件总线的可变引用
95    ///
96    /// # 返回值
97    /// * `ForgeResult<()>` - 成功或错误
98    pub async fn destroy_event_bus(
99        event_bus: &mut EventBus<Event>
100    ) -> ForgeResult<()> {
101        // 先广播销毁事件
102        event_bus.broadcast(Event::Destroy).await?;
103        // 然后停止事件循环
104        event_bus.destroy().await?;
105        debug!("事件总线已销毁");
106        Ok(())
107    }
108
109    /// 销毁事件总线(同步阻塞)
110    ///
111    /// # 参数
112    /// * `event_bus` - 事件总线的可变引用
113    pub fn destroy_event_bus_blocking(event_bus: &mut EventBus<Event>) {
114        event_bus.destroy_blocking();
115        debug!("事件总线已销毁(同步)");
116    }
117}