use std::io::{self, Error, ErrorKind};
use log::{error, trace};
use tokio::sync::mpsc::error::{TryRecvError, TrySendError};
use tokio::sync::mpsc::{Receiver, Sender};
use crate::Payload;
#[derive(Debug)]
pub struct Channels {
requests: Receiver<Payload>,
response: Sender<io::Result<Payload>>,
}
impl Channels {
pub const fn new(requests: Receiver<Payload>, response: Sender<io::Result<Payload>>) -> Self {
Self { requests, response }
}
pub fn receive(&mut self) -> io::Result<Option<Payload>> {
match self.requests.try_recv() {
Ok(request) => Ok(Some(request)),
Err(error) => match error {
TryRecvError::Empty => Ok(None),
TryRecvError::Disconnected => Err(Error::new(
ErrorKind::BrokenPipe,
"Receiver channel disconnected.",
)),
},
}
}
pub fn respond(&self, result: io::Result<Payload>) {
if let Err(error) = self.response.try_send(result) {
match error {
TrySendError::Full(payload) => {
error!("Response channel is congested. Dropping response frame.");
trace!("Response frame was: {payload:?}");
}
TrySendError::Closed(payload) => {
panic!("Response channel has disconnected. Response was: {payload:?}");
}
}
}
}
}