From 9bb6887bedc86ed894068139e78d60786a3db0a0 Mon Sep 17 00:00:00 2001 From: Adrian Malacoda Date: Mon, 13 Feb 2017 00:55:30 -0600 Subject: [PATCH] make plugin produce/consume events api symmetrical --- src/lib.rs | 19 ++++++++----------- src/plugins/echo.rs | 22 +++++++++++++++------- src/plugins/mod.rs | 4 ++-- src/plugins/stdin.rs | 8 ++------ 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 99784b2..bb21388 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -43,29 +43,26 @@ impl Tenquestionmarks { // Plugins push events to tenquestionmarks using this channel. let (ref sender, ref receiver) = mpsc::channel(); - // Plugin event channels. + // Plugin event consumer threads. // tenquestionmarks propagates all events to each plugin through these // channels. let senders: Vec> = self.plugins.values().map(|plugin| { let (sender, receiver) = mpsc::channel(); - scope.spawn(move || { - loop { - match receiver.recv() { - Ok(event) => { plugin.on_event(event) } - Err(error) => { println!("{:?}", error); } - } - } - }); + scope.spawn(move || plugin.consume_events(receiver)); sender }).collect(); - // Plugin main threads. + // Plugin event producer threads. + // Each plugin will produce events which tenquestionmarks will push + // into all other plugins. for plugin in self.plugins.values() { let plugin_sender = sender.clone(); - scope.spawn(move || plugin.run(plugin_sender)); + scope.spawn(move || plugin.produce_events(plugin_sender)); } // tenquestionmarks main event loop. + // tenquestionmarks receives events produced by plugins and pushes them + // into all other plugins loop { match receiver.recv() { Ok(event) => { diff --git a/src/plugins/echo.rs b/src/plugins/echo.rs index ae84790..b5cdda3 100644 --- a/src/plugins/echo.rs +++ b/src/plugins/echo.rs @@ -1,6 +1,7 @@ use plugins::Plugin; use toml::Table; +use std::sync::mpsc::Receiver; use event::Event; pub struct EchoPlugin { @@ -20,15 +21,22 @@ impl EchoPlugin { } impl Plugin for EchoPlugin { - fn on_event (&self, event: Event) { - match event { - Event::Message { content: message, channel: channel, sender: sender } => { - if message.starts_with(self.prefix.as_str()) { - let substring = String::from(&message[self.prefix.chars().count()..]); - println!("Echo: {:?}", substring); + fn consume_events (&self, receiver: Receiver) { + loop { + match receiver.recv() { + Ok(event) => { + match event { + Event::Message { content: message, channel: channel, sender: sender } => { + if message.starts_with(self.prefix.as_str()) { + let substring = String::from(&message[self.prefix.chars().count()..]); + println!("Echo: {:?}", substring); + } + } + _ => () + } } + Err(error) => { } } - _ => () } } } diff --git a/src/plugins/mod.rs b/src/plugins/mod.rs index c726baf..854fe44 100644 --- a/src/plugins/mod.rs +++ b/src/plugins/mod.rs @@ -18,6 +18,6 @@ use std::sync::mpsc::{Sender, Receiver}; pub trait Plugin : Sync { fn register (&self, tenquestionmarks: &Tenquestionmarks) {} - fn on_event (&self, event: Event) {} - fn run (&self, sender: Sender) {} + fn consume_events (&self, receiver: Receiver) {} + fn produce_events (&self, sender: Sender) {} } diff --git a/src/plugins/stdin.rs b/src/plugins/stdin.rs index ab5c9b7..ffd8dd4 100644 --- a/src/plugins/stdin.rs +++ b/src/plugins/stdin.rs @@ -24,13 +24,9 @@ impl StdinPlugin { } impl Plugin for StdinPlugin { - fn register (&self, tenquestionmarks: &Tenquestionmarks) { - - } - - fn run (&self, sender: Sender) { + fn produce_events (&self, sender: Sender) { let user = &self.user; - + loop { let mut input = String::new(); match io::stdin().read_line(&mut input) {