generic_channel/
lib.rs

1//! Generic-channel provides common abstract traits [`Sender`], [`Receiver`] between several channel implementations that widely used in the Rust community.
2//!
3//! Currently support channel implementations:
4//!
5//! * std
6//! * crossbeam-channel
7//! * futures
8//!
9//! NOTE: you need to enable those features in `Cargo.toml`, use `all` flag to enable all.
10//!
11//! A handler function only wants to handle a sender or receiver to send/recv messages and do not
12//! care about the actual type or whether the sender is a crossbeam sender or a futures sender.
13//!
14//! # Examples
15//!
16//! ```rust
17//! # extern crate generic_channel;
18//! # extern crate crossbeam_channel;
19//! use generic_channel::{Sender, TrySendError};
20//!
21//! // this method do not care about sender type.
22//! fn event_producer<S: Sender<i32>>(sender: S) -> Result<(), TrySendError<i32>> {
23//!     for i in 1..10 {
24//!         sender.try_send(i)?
25//!     }
26//!     Ok(())
27//! }
28//!
29//! // we can pass crossbeam channel to event_producer
30//! let (sender, receiver) = crossbeam_channel::unbounded::<i32>();
31//! event_producer(sender);
32//! assert_eq!((1..10).map(|_| receiver.recv().unwrap()).collect::<Vec<_>>(), (1..10).collect::<Vec<_>>());
33//!
34//! // we can also pass a std Sender or a futures Sender
35//! let (sender, receiver) = std::sync::mpsc::channel::<i32>();
36//! event_producer(sender);
37//! assert_eq!((1..10).map(|_| receiver.recv().unwrap()).collect::<Vec<_>>(), (1..10).collect::<Vec<_>>());
38//! ```
39//!
40mod receiver;
41mod sender;
42
43pub use crate::receiver::{Receiver, TryRecvError};
44pub use crate::sender::{Sender, TrySendError};
45
46#[cfg(test)]
47mod tests {
48    use super::*;
49    use std::sync::mpsc::channel;
50    #[test]
51    fn sender_works() {
52        let (sender, receiver) = channel();
53        let sender: Box<dyn Sender<u8>> = Box::new(sender);
54        sender.try_send(1).expect("send");
55        assert_eq!(receiver.recv().expect("recv"), 1u8);
56        drop(receiver);
57        assert_eq!(sender.try_send(2), Err(TrySendError::Disconnected(2u8)));
58    }
59
60    #[test]
61    fn receiver_works() {
62        let (sender, receiver) = channel();
63        let receiver: Box<dyn Receiver<u8>> = Box::new(receiver);
64        assert_eq!(receiver.try_recv(), Err(TryRecvError::Empty));
65        sender.send(1).expect("send");
66        assert_eq!(receiver.try_recv().expect("recv"), 1u8);
67        drop(sender);
68        assert_eq!(receiver.try_recv(), Err(TryRecvError::Disconnected));
69    }
70}