nimbi-rs 0.1.0

A client for interacting with nimbi-api
Documentation
use nimbi_protocol::messages::check_update::{CheckUpdateRequest, CheckUpdateResponse};
use nimbi_protocol::messages::Message;
use nimbi_protocol::microdot::{Deserialize as _, Serialize};
use nimbi_protocol::types::response::Response;

#[cfg(feature = "defmt")]
use defmt::*;

use crate::client::{Client, ClientConnection, ClientError};

impl<T, E> Client<T, E>
where
    T: ClientConnection<E>,
{
    pub async fn check_update<'a>(
        &mut self,
        read_buf: &'a mut [u8],
        req: CheckUpdateRequest<'a>,
    ) -> Result<CheckUpdateResponse, ClientError<E>> {
        let mut write_buf = [0u8; 64];

        let bytes_written = Message::CheckUpdateRequest(req)
            .serialize(&mut write_buf)
            .map_err(ClientError::microdot)?;

        self.connection.send(&write_buf[..bytes_written]).await?;

        self.connection.recv(read_buf).await?;

        let Response {
            success,
            payload,
            error,
        } = Response::<Message>::deserialize(&read_buf[..]).map_err(ClientError::microdot)?;

        match (success, payload, error) {
            (true, Some(Message::CheckUpdateResponse(payload)), None) => Ok(payload),
            (false, None, Some(err)) => Err(ClientError::response(err)),
            _ => Err(ClientError::Other("bad response")),
        }
    }
}