//! Channel error types use std::error::Error; use std::fmt; /// Error returned by the `Sender`. #[derive(Debug)] pub struct SendError(pub T); 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(Debug)] 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 Error for TrySendError {} 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 From> for TrySendError { fn from(src: SendError) -> TrySendError { TrySendError::Closed(src.0) } } // ===== RecvError ===== /// Error returned by `Receiver`. #[derive(Debug)] pub struct RecvError(()); impl fmt::Display for RecvError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!(fmt, "channel closed") } } impl Error for RecvError {} // ===== TryRecvError ===== /// This enumeration is the list of the possible reasons that try_recv /// could not return data when called. #[derive(Debug, PartialEq)] 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 been closed, and there will /// never be any more data received on it. Closed, } impl fmt::Display for TryRecvError { fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { write!( fmt, "{}", match self { TryRecvError::Empty => "channel empty", TryRecvError::Closed => "channel closed", } ) } } impl Error for TryRecvError {} cfg_time! { // ===== SendTimeoutError ===== #[derive(Debug)] /// 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 Error for SendTimeoutError {} 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", } ) } } }