nimbi-rs 0.1.0

A client for interacting with nimbi-api
Documentation
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;

        // read until we have the entire header
        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;

        // read until we have the whole message
        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();
    }
}