Skip to main content

shirabe_core/context/
state.rs

1use crate::command::CommandRegistry;
2use std::collections::HashMap;
3use std::sync::{Arc, RwLock};
4
5use super::listener::{ListenerId, RegisteredListener};
6
7// 共享状态,存储所有事件的监听器
8#[derive(Default)]
9pub struct EventSystemSharedState {
10    /// 事件名 -> 该事件的所有监听器列表
11    pub listeners_by_event: HashMap<String, Vec<Arc<RegisteredListener>>>,
12    /// 监听器ID -> 监听器,用于通过ID快速移除
13    pub listeners_by_id: HashMap<ListenerId, Arc<RegisteredListener>>,
14    /// 存储指令
15    pub command_registry: Arc<RwLock<CommandRegistry>>,
16}
17
18impl EventSystemSharedState {
19    pub fn add_listener(&mut self, event_name: String, listener: Arc<RegisteredListener>) {
20        self.listeners_by_event
21            .entry(event_name)
22            .or_default()
23            .push(Arc::clone(&listener)); // 将监听器的 Arc 引用存入列表
24        self.listeners_by_id.insert(listener.id, listener); // 同时存入 ID 映射
25    }
26
27    pub fn remove_listener(&mut self, id_to_remove: ListenerId) -> bool {
28        if self.listeners_by_id.remove(&id_to_remove).is_some() {
29            // 如果成功从 ID 映射中移除,也需要从事件名映射的列表中移除
30            for listeners in self.listeners_by_event.values_mut() {
31                listeners.retain(|l| l.id != id_to_remove);
32            }
33            true
34        } else {
35            false
36        }
37    }
38}