diff options
Diffstat (limited to 'src/event/handler.rs')
| -rw-r--r-- | src/event/handler.rs | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/event/handler.rs b/src/event/handler.rs index 7d8b5b5..3f9827e 100644 --- a/src/event/handler.rs +++ b/src/event/handler.rs @@ -1,2 +1,69 @@ // TODO : dispatch event through all listener // TODO : maybe compile listener into one ? + +use crate::{ + context::Context, + event::{ + Event, + listener::{Listener, ListenerResult}, + }, +}; + +pub struct EventHandler<Packet, Data = (), Uid = u64> +where + Uid: PartialEq, +{ + listeners: Vec<Box<dyn Listener<Packet, Data, Uid>>>, +} + +impl<Packet, Data, Uid> EventHandler<Packet, Data, Uid> +where + Uid: PartialEq + Clone, +{ + pub fn register<L: Listener<Packet, Data, Uid> + 'static>(&mut self, listener: L) { + self.listeners.push(Box::new(listener)); + } + + pub fn dispatch(&self, event: &Event<Packet, Uid>, ctx: &Context<Data>) { + 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); + } + } + } + } +} |
