use crate::NetworkAddress;
use avila_error::{Error, ErrorKind, Result};
use tokio::net::UdpSocket;
pub struct UdpEndpoint {
socket: UdpSocket,
address: NetworkAddress,
}
impl UdpEndpoint {
pub async fn bind(address: NetworkAddress) -> Result<Self> {
let socket = UdpSocket::bind(address.to_string())
.await
.map_err(|e| Error::new(ErrorKind::Network, format!("Falha ao vincular UDP: {}", e)))?;
Ok(Self { socket, address })
}
pub async fn send_to(&self, data: &[u8], target: &NetworkAddress) -> Result<usize> {
self.socket
.send_to(data, target.to_string())
.await
.map_err(|e| Error::new(ErrorKind::Network, format!("Falha ao enviar: {}", e)))
}
pub async fn receive_from(&self, buffer: &mut [u8]) -> Result<(usize, std::net::SocketAddr)> {
self.socket
.recv_from(buffer)
.await
.map_err(|e| Error::new(ErrorKind::Network, format!("Falha ao receber: {}", e)))
}
pub fn address(&self) -> &NetworkAddress {
&self.address
}
}