Some checks failed
MoreThanText/morethantext/pipeline/head There was a failure building this commit
67 lines
1.7 KiB
Rust
67 lines
1.7 KiB
Rust
use super::Message;
|
|
use std::{
|
|
sync::mpsc::{Receiver, Sender},
|
|
thread::spawn,
|
|
};
|
|
|
|
pub struct Router {
|
|
txs: Vec<Sender<Message>>,
|
|
rx: Receiver<Message>,
|
|
}
|
|
|
|
impl Router {
|
|
fn new(senders: Vec<Sender<Message>>, rx: Receiver<Message>) -> Self {
|
|
Self {
|
|
txs: senders,
|
|
rx: rx,
|
|
}
|
|
}
|
|
|
|
pub fn start(senders: Vec<Sender<Message>>, rx: Receiver<Message>) {
|
|
spawn(move || {
|
|
let router = Router::new(senders, rx);
|
|
router.listen();
|
|
});
|
|
}
|
|
|
|
fn listen(&self) {
|
|
loop {
|
|
let msg = self.rx.recv().unwrap();
|
|
for tx in self.txs.iter() {
|
|
tx.send(msg.clone()).unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod messages {
|
|
use super::super::MsgData;
|
|
use super::{super::test_message::Tester, *};
|
|
use std::sync::mpsc::channel;
|
|
|
|
#[test]
|
|
fn forward_messages() {
|
|
let (tx, rx) = channel();
|
|
let (tx1, rx1) = channel();
|
|
let (tx2, rx2) = channel();
|
|
let senders = vec![tx1, tx2];
|
|
Router::start(senders, rx);
|
|
let data = Tester::Test1;
|
|
let msg = Message::new(&data);
|
|
tx.send(msg.clone()).unwrap();
|
|
let result1 = rx1.recv().unwrap();
|
|
assert_eq!(result1.get_id(), msg.get_id());
|
|
match result1.get_message() {
|
|
MsgData::Test1 => {}
|
|
_ => unreachable!("Should have been test1."),
|
|
}
|
|
let result2 = rx2.recv().unwrap();
|
|
assert_eq!(result2.get_id(), msg.get_id());
|
|
match result2.get_message() {
|
|
MsgData::Test1 => {}
|
|
_ => unreachable!("Should have been test1."),
|
|
}
|
|
}
|
|
}
|