use crate::{
config::ForgeConfig,
debug::debug,
error::{error_utils, ForgeResult},
event::{Event, EventBus},
metrics,
types::RuntimeOptions,
};
use mf_state::state::State;
use std::sync::Arc;
pub struct EventHelper;
impl EventHelper {
pub async fn create_and_init_event_bus(
config: &ForgeConfig,
runtime_options: &RuntimeOptions,
state: Arc<State>,
) -> ForgeResult<EventBus<Event>> {
let event_bus = EventBus::with_config(config.event.clone());
debug!("已创建事件总线");
let handlers = runtime_options.get_event_handlers();
event_bus.add_event_handlers(handlers)?;
event_bus.start_event_loop();
debug!("事件总线已启动");
event_bus.broadcast_blocking(Event::Create(state)).map_err(|e| {
error_utils::event_error(format!("广播 Create 事件失败: {e}"))
})?;
Ok(event_bus)
}
pub async fn emit_event(
event_bus: &mut EventBus<Event>,
event: Event,
) -> ForgeResult<()> {
metrics::event_emitted(event.name());
event_bus.broadcast(event).await?;
Ok(())
}
pub fn emit_event_blocking(
event_bus: &mut EventBus<Event>,
event: Event,
) -> ForgeResult<()> {
metrics::event_emitted(event.name());
event_bus.broadcast_blocking(event)?;
Ok(())
}
pub async fn destroy_event_bus(
event_bus: &mut EventBus<Event>
) -> ForgeResult<()> {
event_bus.broadcast(Event::Destroy).await?;
event_bus.destroy().await?;
debug!("事件总线已销毁");
Ok(())
}
pub fn destroy_event_bus_blocking(event_bus: &mut EventBus<Event>) {
event_bus.destroy_blocking();
debug!("事件总线已销毁(同步)");
}
}