channel_sender/
impl_std.rs1use std::sync::mpsc::TrySendError;
2pub use std::sync::mpsc::{Sender as StdMpscSender, SyncSender as StdMpscSyncSender};
3
4mod multi_producer_impl {
6 use super::*;
7
8 use crate::{error::SendErrorWithoutFull, multi_producer::UnboundedSender};
9
10 impl<T> UnboundedSender<T> for StdMpscSender<T> {
11 fn send(&self, t: T) -> Result<(), SendErrorWithoutFull<T>> {
12 StdMpscSender::send(self, t).map_err(|err| SendErrorWithoutFull::Disconnected(err.0))
13 }
14 }
15}
16
17mod generic_impl {
19 use super::*;
20
21 use crate::{
22 error::SendError,
23 generic::{CloneableSender, Sender},
24 };
25
26 impl<T> Sender<T> for StdMpscSender<T> {
27 fn send(&self, t: T) -> Result<(), SendError<T>> {
28 StdMpscSender::send(self, t).map_err(|err| SendError::Disconnected(err.0))
30 }
31 }
32
33 impl<T> Sender<T> for StdMpscSyncSender<T> {
34 fn send(&self, t: T) -> Result<(), SendError<T>> {
35 StdMpscSyncSender::try_send(self, t).map_err(Into::into)
36 }
37 }
38
39 impl<T> CloneableSender<T> for StdMpscSender<T> {
41 fn send(&self, t: T) -> Result<(), SendError<T>> {
42 StdMpscSender::send(self, t).map_err(|err| SendError::Disconnected(err.0))
44 }
45 }
46
47 impl<T> CloneableSender<T> for StdMpscSyncSender<T> {
48 fn send(&self, t: T) -> Result<(), SendError<T>> {
49 StdMpscSyncSender::try_send(self, t).map_err(Into::into)
50 }
51 }
52}
53
54mod error_convert {
56 use super::*;
57
58 use crate::error::SendError;
59
60 impl<T> From<TrySendError<T>> for SendError<T> {
61 fn from(err: TrySendError<T>) -> Self {
62 match err {
63 TrySendError::Full(v) => Self::Full(v),
64 TrySendError::Disconnected(v) => Self::Disconnected(v),
65 }
66 }
67 }
68}
69
70#[cfg(test)]
71mod multi_producer_impl_tests {
72 use crate::{error::SendErrorWithoutFull, multi_producer::UnboundedSender};
73
74 #[test]
75 fn test_with_channel() {
76 {
77 let (tx, rx) = std::sync::mpsc::channel();
78 let sender: Box<dyn UnboundedSender<usize>> = Box::new(tx);
79 let sender = sender.clone();
80 assert_eq!(sender.send(1), Ok(()));
81 assert_eq!(sender.send(2), Ok(()));
82 assert_eq!(rx.recv(), Ok(1));
83 assert_eq!(rx.recv(), Ok(2));
84 drop(rx);
85 assert_eq!(sender.send(3), Err(SendErrorWithoutFull::Disconnected(3)));
86 }
87 }
88}
89
90#[cfg(test)]
91mod generic_impl_tests {
92 use crate::{
93 error::SendError,
94 generic::{CloneableSender, Sender},
95 };
96
97 #[test]
98 fn test_with_channel() {
99 {
100 let (tx, rx) = std::sync::mpsc::channel();
101 let sender: Box<dyn Sender<usize>> = Box::new(tx);
102 assert_eq!(sender.send(1), Ok(()));
103 assert_eq!(sender.send(2), Ok(()));
104 assert_eq!(rx.recv(), Ok(1));
105 assert_eq!(rx.recv(), Ok(2));
106 drop(rx);
107 assert_eq!(sender.send(3), Err(SendError::Disconnected(3)));
108 }
109 {
110 let (tx, rx) = std::sync::mpsc::channel();
111 let sender: Box<dyn CloneableSender<usize>> = Box::new(tx);
112 let sender = sender.clone();
113 assert_eq!(sender.send(1), Ok(()));
114 assert_eq!(sender.send(2), Ok(()));
115 assert_eq!(rx.recv(), Ok(1));
116 assert_eq!(rx.recv(), Ok(2));
117 drop(rx);
118 assert_eq!(sender.send(3), Err(SendError::Disconnected(3)));
119 }
120 }
121
122 #[test]
123 fn test_with_sync_channel() {
124 {
125 let (tx, rx) = std::sync::mpsc::sync_channel(1);
126 let sender: Box<dyn Sender<usize>> = Box::new(tx);
127 assert_eq!(sender.send(1), Ok(()));
128 assert_eq!(sender.send(2), Err(SendError::Full(2)));
129 assert_eq!(rx.recv(), Ok(1));
130 drop(rx);
131 assert_eq!(sender.send(3), Err(SendError::Disconnected(3)));
132 }
133 {
134 let (tx, rx) = std::sync::mpsc::sync_channel(1);
135 let sender: Box<dyn CloneableSender<usize>> = Box::new(tx);
136 let sender = sender.clone();
137 assert_eq!(sender.send(1), Ok(()));
138 assert_eq!(sender.send(2), Err(SendError::Full(2)));
139 assert_eq!(rx.recv(), Ok(1));
140 drop(rx);
141 assert_eq!(sender.send(3), Err(SendError::Disconnected(3)));
142 }
143 }
144}