use embassy_net::tcp::{Error as TcpError, TcpSocket};
use super::Transport;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TcpTransportError {
Socket(TcpError),
WriteZero,
}
impl From<TcpError> for TcpTransportError {
fn from(error: TcpError) -> Self {
Self::Socket(error)
}
}
pub struct TcpTransport<'sock> {
socket: TcpSocket<'sock>,
}
impl<'sock> TcpTransport<'sock> {
pub fn new(socket: TcpSocket<'sock>) -> Self {
Self { socket }
}
pub fn socket(&self) -> &TcpSocket<'sock> {
&self.socket
}
}
impl<'sock> Transport for TcpTransport<'sock> {
type Error = TcpTransportError;
async fn read(&mut self, buf: &mut [u8]) -> Result<usize, Self::Error> {
self.socket.read(buf).await.map_err(TcpTransportError::from)
}
async fn write(&mut self, buf: &[u8]) -> Result<(), Self::Error> {
let mut written = 0;
while written < buf.len() {
let count = self
.socket
.write(&buf[written..])
.await
.map_err(TcpTransportError::from)?;
if count == 0 {
return Err(TcpTransportError::WriteZero);
}
written += count;
}
Ok(())
}
async fn close(&mut self) {
self.socket.close();
}
}