use std::{io, net::SocketAddr, time::Instant}; use getset::{Getters, Setters}; pub mod handler; pub mod listener; pub enum EventKind where Uid: PartialEq, { Connection(ConnectionEvent), PacketReceived(PacketReceivedEvent), PacketSent(PacketSentEvent), Disconnect(DisconnectEvent), } // TODO : identification // TODO : reason type #[derive(Getters)] pub struct ConnectionEvent where Uid: PartialEq, { #[getset(get = "pub")] peer_addr: SocketAddr, #[getset(get = "pub")] local_addr: SocketAddr, #[getset(get = "pub")] connection_id: Uid, } #[derive(Getters)] pub struct PacketReceivedEvent { #[getset(get = "pub")] packet: Packet, } #[derive(Getters)] pub struct PacketSentEvent { #[getset(get = "pub")] packet: Packet, } // TODO : better error type for protocol violation pub type ProtocolViolation = String; pub enum DisconnectReason { Normal, Error(io::Error), ProtocolError(ProtocolViolation), Timeout, ServerShutdown, } #[derive(Getters)] pub struct DisconnectEvent where Uid: PartialEq, { #[getset(get = "pub")] connection_id: Uid, #[getset(get = "pub")] reason: DisconnectReason, } #[derive(Getters, Setters)] pub struct Event where Uid: PartialEq, { #[getset(get = "pub")] instant: Instant, #[getset(get = "pub", set = "pub")] canceled: bool, #[getset(get = "pub")] kind: EventKind, } impl Event { pub fn new(kind: EventKind) -> Self { Self { instant: Instant::now(), canceled: false, kind, } } pub fn differed(when: Instant, kind: EventKind) -> Self { Self { instant: when, canceled: false, kind, } } }