// TODO : dispatch event through all listener // TODO : maybe compile listener into one ? use crate::{ context::Context, event::{ Event, listener::{Listener, ListenerResult}, }, }; pub struct EventHandler where Uid: PartialEq, { listeners: Vec>>, } impl EventHandler where Uid: PartialEq + Clone, { pub fn register + 'static>(&mut self, listener: L) { self.listeners.push(Box::new(listener)); } pub fn dispatch(&self, event: &Event, ctx: &Context) { match event.kind() { super::EventKind::Connection(connection_event) => { for listener in &self.listeners { if matches!( listener.on_connection(connection_event, ctx), ListenerResult::Cancel | ListenerResult::Disconnect ) { event.cancel(); break; } } } super::EventKind::PacketReceived(packet_received_event) => { for listener in &self.listeners { if matches!( listener.on_packet_received(packet_received_event, ctx), ListenerResult::Cancel | ListenerResult::Disconnect ) { event.cancel(); break; } } } super::EventKind::PacketSent(packet_sent_event) => { for listener in &self.listeners { if matches!( listener.on_packet_sent(packet_sent_event, ctx), ListenerResult::Cancel | ListenerResult::Disconnect ) { event.cancel(); break; } } } super::EventKind::Disconnect(disconnect_event) => { for listener in &self.listeners { listener.on_disconnect(disconnect_event, ctx); } } } } }