use std::collections::HashMap; use crate::event::Event; #[cfg(test)] mod tests; /// A handler for events pub struct EventHandler { event_handlers: HashMap Option + Send + Sync>>>, } impl EventHandler { /// Creates a new vented event_handler pub fn new() -> Self { Self { event_handlers: HashMap::new(), } } /// Adds a handler for the given event pub fn on(&mut self, event_name: &str, handler: F) where F: Fn(Event) -> Option + Send + Sync, { match self.event_handlers.get_mut(event_name) { Some(handlers) => handlers.push(Box::new(handler)), None => { self.event_handlers .insert(event_name.to_string(), vec![Box::new(handler)]); } } } /// Handles a single event pub fn handle_event(&mut self, event: Event) -> Option { if let Some(handlers) = self.event_handlers.get(&event.name) { let mut event = Some(event); for handler in handlers { if let Some(e) = handler(event.unwrap()) { event = Some(e); } else { event = None; break; } } event } else { None } } }