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}