summaryrefslogtreecommitdiff
path: root/src/event/handler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/event/handler.rs')
-rw-r--r--src/event/handler.rs67
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);
+ }
+ }
+ }
+ }
+}