1use std::fmt;
2
3#[derive(Clone, Debug, PartialEq, Eq)]
4pub enum SendError {
5 Full,
6 Disconnected,
7}
8
9#[derive(Clone, PartialEq, Eq)]
10pub struct TrySendError<T> {
11 pub err: SendError,
12 pub val: T,
13}
14
15impl fmt::Display for SendError {
16 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17 match &self {
18 SendError::Full => write!(f, "send failed because channel is full"),
19 SendError::Disconnected => write!(f, "send failed because receiver is gone"),
20 }
21 }
22}
23
24impl std::error::Error for SendError {}
25
26impl SendError {
27 pub fn is_full(&self) -> bool {
28 matches!(&self, SendError::Full)
29 }
30
31 pub fn is_disconnected(&self) -> bool {
32 matches!(&self, SendError::Disconnected)
33 }
34}
35
36impl<T> fmt::Debug for TrySendError<T> {
37 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
38 f.debug_struct("TrySendError")
39 .field("kind", &self.err)
40 .finish()
41 }
42}
43
44impl<T> fmt::Display for TrySendError<T> {
45 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46 self.err.fmt(f)
47 }
48}
49
50impl<T: core::any::Any> std::error::Error for TrySendError<T> {}
51
52impl<T> TrySendError<T> {
53 pub fn is_full(&self) -> bool {
54 self.err.is_full()
55 }
56
57 pub fn is_disconnected(&self) -> bool {
58 self.err.is_disconnected()
59 }
60
61 pub fn into_inner(self) -> T {
62 self.val
63 }
64
65 pub fn into_send_error(self) -> SendError {
66 self.err
67 }
68}
69
70#[derive(Debug)]
71pub enum TryRecvError {
72 Empty,
73 Disconnected,
74}
75
76impl fmt::Display for TryRecvError {
77 fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
78 match *self {
79 TryRecvError::Empty => "receiving on an empty channel".fmt(fmt),
80 TryRecvError::Disconnected => "receiving on a closed channel".fmt(fmt),
81 }
82 }
83}
84
85impl std::error::Error for TryRecvError {}