use std::net::SocketAddr;
use smol::channel::{Sender, TrySendError};
use crate::NaiaServerSocketError;
pub trait PacketSender: PacketSenderClone + Send + Sync {
fn send(&self, address: &SocketAddr, payload: &[u8]) -> Result<(), NaiaServerSocketError>;
}
#[derive(Clone)]
pub struct PacketSenderImpl {
channel_sender: Sender<(SocketAddr, Box<[u8]>)>,
}
impl PacketSenderImpl {
pub fn new(channel_sender: Sender<(SocketAddr, Box<[u8]>)>) -> Self {
PacketSenderImpl { channel_sender }
}
}
impl PacketSender for PacketSenderImpl {
fn send(&self, address: &SocketAddr, payload: &[u8]) -> Result<(), NaiaServerSocketError> {
self.channel_sender
.try_send((*address, payload.into()))
.map_err(|err| match err {
TrySendError::Full(_) => unreachable!("the channel is expected to be unbound"),
TrySendError::Closed(_) => NaiaServerSocketError::SendError(*address),
})
}
}
pub trait PacketSenderClone {
fn clone_box(&self) -> Box<dyn PacketSender>;
}
impl<T: 'static + PacketSender + Clone> PacketSenderClone for T {
fn clone_box(&self) -> Box<dyn PacketSender> {
Box::new(self.clone())
}
}
impl Clone for Box<dyn PacketSender> {
fn clone(&self) -> Box<dyn PacketSender> {
PacketSenderClone::clone_box(self.as_ref())
}
}