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::actor::message::Message;
use crate::{HexSlice, Payload};
type Response = Receiver<io::Result<()>>;
type Error = SendError<Message>;
#[derive(Clone, Debug)]
pub struct Proxy {
sender: Sender<Message>,
}
impl Proxy {
#[must_use]
pub(crate) const fn new(sender: Sender<Message>) -> Self {
Self { sender }
}
pub async fn send(&self, payload: Payload) -> Result<Response, Error> {
let (response_tx, response_rx) = channel();
trace!("Sending chunk: {:#04X}", HexSlice::new(&payload));
self.sender
.send(Message::Payload {
payload: Box::new(payload),
response_tx,
})
.await?;
Ok(response_rx)
}
}