use std::io::{Error, ErrorKind};
use log::error;
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<std::io::Result<Payload>>,
}
impl Channels {
pub const fn new(
requests: Receiver<Payload>,
response: Sender<std::io::Result<Payload>>,
) -> Self {
Self { requests, response }
}
pub fn receive(&mut self) -> std::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: std::io::Result<Payload>) {
if let Err(error) = self.response.try_send(result) {
match error {
TrySendError::Full(_) => {
error!("Response channel is congested. Dropping response frame.");
}
TrySendError::Closed(_) => {
error!("Response channel has disconnected. Closing response channel.");
}
}
}
}
}