use enet_sys::{
ENetEvent, _ENetEventType_ENET_EVENT_TYPE_CONNECT, _ENetEventType_ENET_EVENT_TYPE_DISCONNECT,
_ENetEventType_ENET_EVENT_TYPE_NONE, _ENetEventType_ENET_EVENT_TYPE_RECEIVE,
};
use crate::{Packet, Peer};
#[derive(Debug)]
pub enum Event<'a, T> {
Connect(Peer<'a, T>),
Disconnect(Peer<'a, T>, u32),
Receive {
sender: Peer<'a, T>,
channel_id: u8,
packet: Packet,
},
}
impl<'a, T> Event<'a, T> {
pub(crate) fn from_sys_event<'b>(event_sys: &'b ENetEvent) -> Option<Event<'a, T>> {
#[allow(non_upper_case_globals)]
match event_sys.type_ {
_ENetEventType_ENET_EVENT_TYPE_NONE => None,
_ENetEventType_ENET_EVENT_TYPE_CONNECT => {
Some(Event::Connect(Peer::new(event_sys.peer)))
}
_ENetEventType_ENET_EVENT_TYPE_DISCONNECT => {
Some(Event::Disconnect(Peer::new(event_sys.peer), event_sys.data))
}
_ENetEventType_ENET_EVENT_TYPE_RECEIVE => Some(Event::Receive {
sender: Peer::new(event_sys.peer),
channel_id: event_sys.channelID,
packet: Packet::from_sys_packet(event_sys.packet),
}),
_ => panic!("unrecognized event type: {}", event_sys.type_),
}
}
}
impl<'a, T> Drop for Event<'a, T> {
fn drop(&mut self) {
if let Event::Disconnect(peer, _) = self {
peer.set_data(None)
}
}
}