use core::net::SocketAddr;
#[non_exhaustive]
#[derive(Copy, Clone, PartialEq, Debug)]
pub enum TcpErrorKind {
PipeClosed,
Other,
}
pub trait TcpError: core::fmt::Debug {
fn kind(&self) -> TcpErrorKind;
}
pub trait TcpClientStack {
type TcpSocket;
type Error: TcpError;
fn socket(&mut self) -> Result<Self::TcpSocket, Self::Error>;
fn connect(
&mut self,
socket: &mut Self::TcpSocket,
remote: SocketAddr,
) -> nb::Result<(), Self::Error>;
fn send(
&mut self,
socket: &mut Self::TcpSocket,
buffer: &[u8],
) -> nb::Result<usize, Self::Error>;
fn receive(
&mut self,
socket: &mut Self::TcpSocket,
buffer: &mut [u8],
) -> nb::Result<usize, Self::Error>;
fn close(&mut self, socket: Self::TcpSocket) -> Result<(), Self::Error>;
}
pub trait TcpFullStack: TcpClientStack {
fn bind(&mut self, socket: &mut Self::TcpSocket, local_port: u16) -> Result<(), Self::Error>;
fn listen(&mut self, socket: &mut Self::TcpSocket) -> Result<(), Self::Error>;
fn accept(
&mut self,
socket: &mut Self::TcpSocket,
) -> nb::Result<(Self::TcpSocket, SocketAddr), Self::Error>;
}
impl<T: TcpClientStack> TcpClientStack for &mut T {
type Error = T::Error;
type TcpSocket = T::TcpSocket;
fn socket(&mut self) -> Result<Self::TcpSocket, Self::Error> {
T::socket(self)
}
fn connect(
&mut self,
socket: &mut Self::TcpSocket,
remote: SocketAddr,
) -> nb::Result<(), Self::Error> {
T::connect(self, socket, remote)
}
fn send(
&mut self,
socket: &mut Self::TcpSocket,
buffer: &[u8],
) -> nb::Result<usize, Self::Error> {
T::send(self, socket, buffer)
}
fn receive(
&mut self,
socket: &mut Self::TcpSocket,
buffer: &mut [u8],
) -> nb::Result<usize, Self::Error> {
T::receive(self, socket, buffer)
}
fn close(&mut self, socket: Self::TcpSocket) -> Result<(), Self::Error> {
T::close(self, socket)
}
}