use std::{
fmt,
task::{Context, Poll},
};
use bytes::Bytes;
use super::ConnectionError;
pub trait DatagramConnection {
type Sender: SendDatagram;
type Receiver: RecvDatagram;
fn take_datagrams(&mut self) -> Option<(Self::Sender, Self::Receiver)>;
}
pub trait SendDatagram {
fn max_datagram_size(&self) -> Option<usize>;
fn poll_send(&mut self, cx: &mut Context<'_>, data: &Bytes) -> Poll<Result<(), DatagramError>>;
}
pub trait RecvDatagram {
fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll<Result<Option<Bytes>, ConnectionError>>;
}
#[derive(Debug)]
#[non_exhaustive]
pub enum DatagramError {
Unavailable,
TooLarge,
Connection(ConnectionError),
}
impl fmt::Display for DatagramError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Unavailable => f.write_str("QUIC Datagrams unavailable"),
Self::TooLarge => f.write_str("QUIC Datagram too large"),
Self::Connection(error) => write!(f, "QUIC Datagram connection error: {error}"),
}
}
}
impl std::error::Error for DatagramError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Connection(error) => Some(error),
_ => None,
}
}
}