use derive_more::Debug;
pub use prelude::channel;
pub(crate) use prelude::*;
use std::any;
#[derive(Debug)]
pub enum Message<T> {
#[debug("Received: {}", any::type_name::<T>())]
Received(T),
ChannelDisconnected,
ChannelEmpty,
}
pub trait SenderExt<T> {
fn try_send_msg(&self, msg: T) -> Option<T>;
}
pub trait ReceiverExt<T> {
fn try_recv_msg(&self) -> Message<T>;
}
#[cfg(not(any(feature = "crossbeam", feature = "flume", feature = "loole")))]
pub mod prelude {
pub use std::sync::mpsc::{Receiver, SendError, Sender, channel};
use super::{Message, ReceiverExt, SenderExt};
use std::sync::mpsc::TryRecvError;
impl<T> SenderExt<T> for Sender<T> {
fn try_send_msg(&self, t: T) -> Option<T> {
match self.send(t) {
Ok(_) => None,
Err(SendError(t)) => Some(t),
}
}
}
impl<T> ReceiverExt<T> for Receiver<T> {
fn try_recv_msg(&self) -> super::Message<T> {
match self.try_recv() {
Ok(t) => Message::Received(t),
Err(TryRecvError::Empty) => Message::ChannelEmpty,
Err(TryRecvError::Disconnected) => Message::ChannelDisconnected,
}
}
}
}
#[cfg(all(feature = "crossbeam", not(any(feature = "flume", feature = "loole"))))]
pub mod prelude {
pub use crossbeam_channel::{Receiver, SendError, Sender, unbounded as channel};
use super::{Message, ReceiverExt, SenderExt};
use crossbeam_channel::TryRecvError;
impl<T> SenderExt<T> for Sender<T> {
fn try_send_msg(&self, t: T) -> Option<T> {
match self.send(t) {
Ok(_) => None,
Err(SendError(t)) => Some(t),
}
}
}
impl<T> ReceiverExt<T> for Receiver<T> {
fn try_recv_msg(&self) -> super::Message<T> {
match self.try_recv() {
Ok(t) => Message::Received(t),
Err(TryRecvError::Empty) => Message::ChannelEmpty,
Err(TryRecvError::Disconnected) => Message::ChannelDisconnected,
}
}
}
}
#[cfg(all(feature = "flume", not(any(feature = "crossbeam", feature = "loole"))))]
pub mod prelude {
pub use flume::{Receiver, SendError, Sender, unbounded as channel};
use super::{Message, ReceiverExt, SenderExt};
use flume::TryRecvError;
impl<T> SenderExt<T> for Sender<T> {
fn try_send_msg(&self, t: T) -> Option<T> {
match self.send(t) {
Ok(_) => None,
Err(SendError(t)) => Some(t),
}
}
}
impl<T> ReceiverExt<T> for Receiver<T> {
fn try_recv_msg(&self) -> super::Message<T> {
match self.try_recv() {
Ok(t) => Message::Received(t),
Err(TryRecvError::Empty) => Message::ChannelEmpty,
Err(TryRecvError::Disconnected) => Message::ChannelDisconnected,
}
}
}
}
#[cfg(all(feature = "loole", not(any(feature = "crossbeam", feature = "flume"))))]
pub mod prelude {
pub use loole::{Receiver, SendError, Sender, unbounded as channel};
use super::{Message, ReceiverExt, SenderExt};
use loole::TryRecvError;
impl<T> SenderExt<T> for Sender<T> {
fn try_send_msg(&self, t: T) -> Option<T> {
match self.send(t) {
Ok(_) => None,
Err(SendError(t)) => Some(t),
}
}
}
impl<T> ReceiverExt<T> for Receiver<T> {
fn try_recv_msg(&self) -> super::Message<T> {
match self.try_recv() {
Ok(t) => Message::Received(t),
Err(TryRecvError::Empty) => Message::ChannelEmpty,
Err(TryRecvError::Disconnected) => Message::ChannelDisconnected,
}
}
}
}