diff --git a/src/core/event_man.rs b/src/core/event_man.rs index 08e27f3..68b6c54 100644 --- a/src/core/event_man.rs +++ b/src/core/event_man.rs @@ -1,5 +1,4 @@ use std::collections::HashMap; -use std::sync::mpsc::{Receiver, Sender}; use crate::core::events::{Event, EventRaw, GroupId}; #[derive(PartialEq, Eq, Hash, Copy, Clone)] @@ -8,60 +7,74 @@ enum ListenerType { Group(GroupId), } -struct Listener { +pub trait EventRecipient { + type Error; + fn send_to(&mut self, event: Event) -> Result<(), Self::Error>; +} + +struct Listener { _ltype: ListenerType, - dest: Sender, + dest: Box>, } -pub struct EventManager { - listeners: HashMap>, - event_receiver: Receiver, +pub trait ReceivesEvent { + fn receive(&mut self) -> Option; } -impl EventManager { - pub fn subcribe_single(&mut self, event: Event, dest: Sender) { + +pub struct EventManager { + listeners: HashMap>>, + event_receiver: dyn ReceivesEvent, +} + +impl EventManager { + pub fn subcribe_single(&mut self, event: Event, dest: impl EventRecipient + 'static) { self.update_listeners(ListenerType::Single(event.raw()), dest); } - pub fn subscribe_group(&mut self, group_id: GroupId, dest: Sender) { + pub fn subscribe_group(&mut self, group_id: GroupId, dest: impl EventRecipient + 'static) { self.update_listeners(ListenerType::Group(group_id), dest); } - fn update_listeners(&mut self, key: ListenerType, dest: Sender) { - if let std::collections::hash_map::Entry::Vacant(e) = self.listeners.entry(key) { - e.insert(vec![Listener { _ltype: key, dest }]); + fn update_listeners (&mut self, key: ListenerType, dest: impl EventRecipient + 'static) { + if !self.listeners.contains_key(&key) { + self.listeners.insert(key, vec![Listener { _ltype: key, dest: Box::new(dest) }]); } else { let vec = self.listeners.get_mut(&key).unwrap(); - vec.push(Listener { _ltype: key, dest }); + vec.push(Listener { _ltype: key, dest: Box::new(dest) }); } } - pub fn periodic_op(&mut self) { - if let Ok(event) = self.event_receiver.recv() { + pub fn periodic_op(&mut self) -> Result<(), E> { + if let Some(event) = self.event_receiver.receive() { println!("Received event {:?}", event); - for (ltype, listener_list) in self.listeners.iter() { + for (ltype, listener_list) in self.listeners.iter_mut() { match ltype { ListenerType::Single(raw_event) => { if event.raw() == *raw_event { - for listener in listener_list { - listener.dest.send(event).expect("Sending event failed"); + for listener in listener_list.iter_mut() { + listener.dest.send_to(event)?; } } } ListenerType::Group(group_id) => { if event.group_id() == *group_id { - for listener in listener_list { - listener.dest.send(event).expect("Sending event failed"); + for listener in listener_list.iter_mut() { + listener.dest.send_to(event)?; } } } } } } + Ok(()) } } #[cfg(test)] mod tests { + #[test] + fn basic_test() { + } } \ No newline at end of file