//! Channel error types. use std::error::Error; use std::fmt; /// Error returned by the `Sender`. #[derive(PartialEq, Eq, Clone, Copy)] pub struct SendError(pub T); impl fmt::Debug for SendError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("SendError").finish_non_exhaustive() } } impl fmt::Display for SendError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!(fmt, "channel closed") } } impl std::error::Error for SendError {} // ===== TrySendError ===== /// This enumeration is the list of the possible error outcomes for the /// [try_send](super::Sender::try_send) method. #[derive(PartialEq, Eq, Clone, Copy)] pub enum TrySendError { /// The data could not be sent on the channel because the channel is /// currently full and sending would require blocking. Full(T), /// The receive half of the channel was explicitly closed or has been /// dropped. Closed(T), } impl fmt::Debug for TrySendError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { TrySendError::Full(..) => "Full(..)".fmt(f), TrySendError::Closed(..) => "Closed(..)".fmt(f), } } } impl fmt::Display for TrySendError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!( fmt, "{}", match self { TrySendError::Full(..) => "no available capacity", TrySendError::Closed(..) => "channel closed", } ) } } impl Error for TrySendError {} impl From> for TrySendError { fn from(src: SendError) -> TrySendError { TrySendError::Closed(src.0) } } // ===== TryRecvError ===== /// Error returned by `try_recv`. #[derive(PartialEq, Eq, Clone, Copy, Debug)] pub enum TryRecvError { /// This **channel** is currently empty, but the **Sender**(s) have not yet /// disconnected, so data may yet become available. Empty, /// The **channel**'s sending half has become disconnected, and there will /// never be any more data received on it. Disconnected, } impl fmt::Display for TryRecvError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { TryRecvError::Empty => "receiving on an empty channel".fmt(fmt), TryRecvError::Disconnected => "receiving on a closed channel".fmt(fmt), } } } impl Error for TryRecvError {} // ===== RecvError ===== /// Error returned by `Receiver`. #[derive(Debug, Clone)] #[doc(hidden)] #[deprecated(note = "This type is unused because recv returns an Option.")] pub struct RecvError(()); #[allow(deprecated)] impl fmt::Display for RecvError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!(fmt, "channel closed") } } #[allow(deprecated)] impl Error for RecvError {} cfg_time! { // ===== SendTimeoutError ===== #[derive(PartialEq, Eq, Clone, Copy)] /// Error returned by [`Sender::send_timeout`](super::Sender::send_timeout)]. pub enum SendTimeoutError { /// The data could not be sent on the channel because the channel is /// full, and the timeout to send has elapsed. Timeout(T), /// The receive half of the channel was explicitly closed or has been /// dropped. Closed(T), } impl fmt::Debug for SendTimeoutError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { SendTimeoutError::Timeout(..) => "Timeout(..)".fmt(f), SendTimeoutError::Closed(..) => "Closed(..)".fmt(f), } } } impl fmt::Display for SendTimeoutError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!( fmt, "{}", match self { SendTimeoutError::Timeout(..) => "timed out waiting on send operation", SendTimeoutError::Closed(..) => "channel closed", } ) } } impl Error for SendTimeoutError {} }