From bb41e396aca01fee9f81785681fac0a79d0fd9d8 Mon Sep 17 00:00:00 2001 From: zirkonya Date: Thu, 27 Aug 2026 09:45:12 +0200 Subject: split event and enhance context --- src/event/handler.rs | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'src/event/handler.rs') 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 +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); + } + } + } + } +} -- cgit v1.2.3