use embassy_net::tcp::{Error, TcpSocket};
use protocol::microdot::{
helpers::{Header, HEADER_SIZE},
Deserialize as _,
};
#[cfg(feature = "defmt")]
use defmt::*;
use super::*;
impl ClientConnection<Error> for TcpSocket<'_> {
async fn send(&mut self, buf: &[u8]) -> Result<usize, ClientError<Error>> {
let u = self.write(buf).await?;
self.flush().await?;
Ok(u)
}
async fn recv(&mut self, buf: &mut [u8]) -> Result<usize, ClientError<Error>> {
let mut bytes_read = 0;
while bytes_read < HEADER_SIZE {
if bytes_read == HEADER_SIZE {
break;
}
let n = match self.read(&mut buf[..HEADER_SIZE]).await {
Ok(n) => n,
Err(err) => {
return Err(err)?;
}
};
if n == 0 {
break;
}
bytes_read += n;
}
let header = Header::deserialize(&buf[..HEADER_SIZE]).map_err(ClientError::microdot)?;
let mut bytes_read = 0;
while bytes_read < header.size {
let n = self.read(&mut buf[bytes_read + HEADER_SIZE..]).await?;
if n == 0 {
break;
}
bytes_read += n;
}
Ok(bytes_read + HEADER_SIZE)
}
async fn close(&mut self) {
self.close();
}
}