use core::fmt;
use crate::semaphore::TryAcquireError;
#[derive(Clone, Copy, PartialEq, Eq)]
pub struct SendError<T>(pub T);
impl<T> fmt::Debug for SendError<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("SendError").finish_non_exhaustive()
}
}
impl<T> fmt::Display for SendError<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str("failed to send value, channel closed")
}
}
#[cfg(feature = "std")]
impl<T> std::error::Error for SendError<T> {}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum TryRecvError {
Empty,
Disconnected,
}
impl TryRecvError {
pub fn is_empty(self) -> bool {
matches!(self, Self::Empty)
}
pub fn is_disconnected(self) -> bool {
matches!(self, Self::Disconnected)
}
}
impl fmt::Display for TryRecvError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Empty => f.write_str("channel is empty"),
Self::Disconnected => f.write_str("channel is closed"),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for TryRecvError {}
#[derive(Clone, Copy, PartialEq, Eq)]
pub enum TrySendError<T> {
Full(T),
Closed(T),
}
impl<T> TrySendError<T> {
pub fn is_full(&self) -> bool {
matches!(self, Self::Full(_))
}
pub fn is_closed(&self) -> bool {
matches!(self, Self::Closed(_))
}
#[cfg(feature = "alloc")]
pub(crate) fn set<U>(self, value: U) -> TrySendError<U> {
match self {
Self::Full(_) => TrySendError::Full(value),
Self::Closed(_) => TrySendError::Closed(value),
}
}
}
impl<T> From<SendError<T>> for TrySendError<T> {
fn from(err: SendError<T>) -> Self {
Self::Closed(err.0)
}
}
impl<T> From<(TryAcquireError, T)> for TrySendError<T> {
fn from((err, elem): (TryAcquireError, T)) -> Self {
match err {
TryAcquireError::Closed => Self::Closed(elem),
TryAcquireError::NoPermits => Self::Full(elem),
}
}
}
impl<T> fmt::Debug for TrySendError<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut dbg = f.debug_struct("TrySendError");
match self {
Self::Full(_) => dbg.field("full", &true).finish_non_exhaustive(),
Self::Closed(_) => dbg.field("closed", &true).finish_non_exhaustive(),
}
}
}
impl<T> fmt::Display for TrySendError<T> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Full(_) => f.write_str("failed to send value, channel full"),
Self::Closed(_) => f.write_str("failed to send value, channel closed"),
}
}
}
#[cfg(feature = "std")]
impl<T> std::error::Error for TrySendError<T> {}