ashv2 6.0.2

Implementation of the Asynchronous Serial Host (ASH) protocol.
Documentation
use std::io;

use log::trace;
use tokio::sync::mpsc::Sender;
use tokio::sync::mpsc::error::SendError;
use tokio::sync::oneshot::{Receiver, channel};

use crate::Payload;
use crate::actor::message::Message;
use crate::utils::HexSlice;

type Response = Receiver<io::Result<()>>;

/// `ASHv2` actor proxy.
#[derive(Clone, Debug)]
pub struct Proxy {
    inner: Sender<Message>,
}

impl Proxy {
    /// Send data to the `ASHv2` actor.
    ///
    /// # Errors
    ///
    /// Returns an [`SendError<Message>`] if sending the message fails.
    pub async fn send(&self, payload: Payload) -> Result<Response, SendError<Message>> {
        let (response_tx, response_rx) = channel();

        trace!("Sending chunk: {:#04X}", HexSlice::new(&payload));
        self.inner
            .send(Message::Payload {
                payload: Box::new(payload),
                response_tx,
            })
            .await?;

        Ok(response_rx)
    }
}

impl From<Sender<Message>> for Proxy {
    fn from(inner: Sender<Message>) -> Self {
        Self { inner }
    }
}