channel_sender/
impl_std.rs

1use std::sync::mpsc::TrySendError;
2pub use std::sync::mpsc::{Sender as StdMpscSender, SyncSender as StdMpscSyncSender};
3
4//
5mod 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
17//
18mod 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            // https://doc.rust-lang.org/std/sync/mpsc/struct.SendError.html
29            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    //
40    impl<T> CloneableSender<T> for StdMpscSender<T> {
41        fn send(&self, t: T) -> Result<(), SendError<T>> {
42            // https://doc.rust-lang.org/std/sync/mpsc/struct.SendError.html
43            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
54//
55mod 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}