use super::config::DatagramConfig;
use async_trait::async_trait;
use std::net::SocketAddr;
#[async_trait]
pub trait DatagramProtocol {
type Error: Send + Into<crate::EchoError>;
type Socket: Send;
async fn bind(config: &DatagramConfig) -> std::result::Result<Self::Socket, Self::Error>;
async fn recv_from(
socket: &Self::Socket,
buffer: &mut [u8],
) -> std::result::Result<(usize, SocketAddr), Self::Error>;
async fn send_to(
socket: &Self::Socket,
data: &[u8],
addr: SocketAddr,
) -> std::result::Result<usize, Self::Error>;
fn map_io_error(err: std::io::Error) -> Self::Error;
}