use std::{
io,
sync::mpsc::{Receiver, Sender, SyncSender, TryRecvError, TrySendError},
};
use crate::{
DriveOutcome, Publish, PublishOutcome, Receive, ReceiveOutcome, Session, SessionStatus,
};
impl<T: 'static> Session for Sender<T> {
fn status(&self) -> SessionStatus {
SessionStatus::Established
}
fn drive(&mut self) -> Result<DriveOutcome, io::Error> {
Ok(DriveOutcome::Idle)
}
}
impl<T: 'static> Publish for Sender<T> {
type PublishPayload<'a> = T where
Self: 'a;
fn publish<'a>(
&mut self,
payload: Self::PublishPayload<'a>,
) -> Result<PublishOutcome<Self::PublishPayload<'a>>, io::Error> {
match self.send(payload) {
Ok(()) => Ok(PublishOutcome::Published),
Err(_) => Err(io::Error::new(io::ErrorKind::NotConnected, "Disconnected")),
}
}
}
impl<T: 'static> Session for SyncSender<T> {
fn status(&self) -> SessionStatus {
SessionStatus::Established
}
fn drive(&mut self) -> Result<DriveOutcome, io::Error> {
Ok(DriveOutcome::Idle)
}
}
impl<T: 'static> Publish for SyncSender<T> {
type PublishPayload<'a> = T where
Self: 'a;
fn publish<'a>(
&mut self,
payload: Self::PublishPayload<'a>,
) -> Result<PublishOutcome<Self::PublishPayload<'a>>, io::Error> {
match self.try_send(payload) {
Ok(()) => Ok(PublishOutcome::Published),
Err(TrySendError::Disconnected(_)) => Ok(PublishOutcome::Published),
Err(TrySendError::Full(x)) => Ok(PublishOutcome::Incomplete(x)),
}
}
}
impl<T: 'static> Session for Receiver<T> {
fn status(&self) -> SessionStatus {
SessionStatus::Established
}
fn drive(&mut self) -> Result<DriveOutcome, io::Error> {
Ok(DriveOutcome::Idle)
}
}
impl<T: 'static> Receive for Receiver<T> {
type ReceivePayload<'a> = T
where
Self: 'a;
fn receive<'a>(&'a mut self) -> Result<ReceiveOutcome<Self::ReceivePayload<'a>>, io::Error> {
match self.try_recv() {
Ok(x) => Ok(ReceiveOutcome::Payload(x)),
Err(TryRecvError::Empty) => Ok(ReceiveOutcome::Idle),
Err(TryRecvError::Disconnected) => Ok(ReceiveOutcome::Idle),
}
}
}