orbit/events/
emitter.rs

1//! Event emitter for component events
2
3use std::any::TypeId;
4use std::collections::HashMap;
5use std::sync::{Arc, Mutex};
6
7use crate::events::Event;
8
9/// Type for event handler callbacks
10type EventCallback = Box<dyn Fn(&dyn Event) + Send + Sync>;
11
12/// Event emitter for handling component events
13#[derive(Clone)]
14pub struct EventEmitter {
15    /// Event handlers grouped by event type
16    handlers: Arc<Mutex<HashMap<TypeId, Vec<Arc<EventCallback>>>>>,
17}
18
19impl std::fmt::Debug for EventEmitter {
20    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21        f.debug_struct("EventEmitter")
22            .field("handlers", &"[EventHandlers]")
23            .finish()
24    }
25}
26
27impl EventEmitter {
28    /// Create a new event emitter
29    pub fn new() -> Self {
30        Self {
31            handlers: Arc::new(Mutex::new(HashMap::new())),
32        }
33    }
34
35    /// Register an event handler
36    pub fn on<E: Event + 'static>(
37        &mut self,
38        handler: impl Fn(&E) + Send + Sync + 'static,
39    ) -> Result<(), String> {
40        let type_id = TypeId::of::<E>();
41
42        let callback: EventCallback = Box::new(move |event| {
43            if let Some(typed_event) = event.as_any().downcast_ref::<E>() {
44                handler(typed_event);
45            }
46        });
47        let mut handlers = self
48            .handlers
49            .lock()
50            .map_err(|e| format!("Failed to lock event handlers: {e}"))?;
51
52        handlers
53            .entry(type_id)
54            .or_insert_with(Vec::new)
55            .push(Arc::new(callback));
56
57        Ok(())
58    }
59
60    /// Emit an event
61    pub fn emit<E: Event>(&self, event: &E) -> Result<(), String> {
62        let type_id = TypeId::of::<E>();
63        let handlers = self
64            .handlers
65            .lock()
66            .map_err(|e| format!("Failed to lock event handlers: {e}"))?;
67
68        if let Some(handlers) = handlers.get(&type_id) {
69            for handler in handlers {
70                handler(event);
71            }
72        }
73        Ok(())
74    }
75
76    /// Remove all handlers
77    pub fn clear(&mut self) -> Result<(), String> {
78        let mut handlers = self
79            .handlers
80            .lock()
81            .map_err(|e| format!("Failed to lock event handlers: {e}"))?;
82        handlers.clear();
83        Ok(())
84    }
85}
86
87impl Default for EventEmitter {
88    fn default() -> Self {
89        Self::new()
90    }
91}