shirabe_core/context/
state.rs1use crate::command::CommandRegistry;
2use std::collections::HashMap;
3use std::sync::{Arc, RwLock};
4
5use super::listener::{ListenerId, RegisteredListener};
6
7#[derive(Default)]
9pub struct EventSystemSharedState {
10 pub listeners_by_event: HashMap<String, Vec<Arc<RegisteredListener>>>,
12 pub listeners_by_id: HashMap<ListenerId, Arc<RegisteredListener>>,
14 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)); self.listeners_by_id.insert(listener.id, listener); }
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 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}