naia_server_socket/
packet_receiver.rs

1use std::net::SocketAddr;
2
3use smol::channel::Receiver;
4
5use super::error::NaiaServerSocketError;
6
7/// Used to receive packets from the Server Socket
8pub trait PacketReceiver: PacketReceiverClone + Send + Sync {
9    /// Receives a packet from the Server Socket
10    fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, NaiaServerSocketError>;
11}
12
13/// Used to receive packets from the Server Socket
14#[derive(Clone)]
15pub struct PacketReceiverImpl {
16    #[allow(clippy::type_complexity)]
17    channel_receiver: Receiver<Result<(SocketAddr, Box<[u8]>), NaiaServerSocketError>>,
18    last_payload: Option<Box<[u8]>>,
19}
20
21impl PacketReceiverImpl {
22    /// Creates a new PacketReceiver
23    #[allow(clippy::type_complexity)]
24    pub fn new(
25        channel_receiver: Receiver<Result<(SocketAddr, Box<[u8]>), NaiaServerSocketError>>,
26    ) -> Self {
27        PacketReceiverImpl {
28            channel_receiver,
29            last_payload: None,
30        }
31    }
32}
33
34impl PacketReceiver for PacketReceiverImpl {
35    fn receive(&mut self) -> Result<Option<(SocketAddr, &[u8])>, NaiaServerSocketError> {
36        match self.channel_receiver.try_recv() {
37            Ok(result) => match result {
38                Ok((address, payload)) => {
39                    self.last_payload = Some(payload);
40                    return Ok(Some((address, self.last_payload.as_ref().unwrap())));
41                }
42                Err(_) => Ok(None),
43            },
44            Err(_) => Ok(None),
45        }
46    }
47}
48
49/// Used to clone Box<dyn PacketReceiver>
50pub trait PacketReceiverClone {
51    /// Clone the boxed PacketReceiver
52    fn clone_box(&self) -> Box<dyn PacketReceiver>;
53}
54
55impl<T: 'static + PacketReceiver + Clone> PacketReceiverClone for T {
56    fn clone_box(&self) -> Box<dyn PacketReceiver> {
57        Box::new(self.clone())
58    }
59}
60
61impl Clone for Box<dyn PacketReceiver> {
62    fn clone(&self) -> Box<dyn PacketReceiver> {
63        PacketReceiverClone::clone_box(self.as_ref())
64    }
65}