From 66180578d631f6420645331f21a8cf358fbbd5ff Mon Sep 17 00:00:00 2001 From: Adrian Malacoda Date: Wed, 15 Feb 2017 23:41:29 -0600 Subject: [PATCH] alternate implementation using Box and clone --- src/event/mod.rs | 8 ++++---- src/lib.rs | 27 +++++++++++++++++++-------- src/plugins/discord.rs | 28 ++++++++++++++++++++++------ src/plugins/stdin.rs | 20 ++++++++++++++++++-- 4 files changed, 63 insertions(+), 20 deletions(-) diff --git a/src/event/mod.rs b/src/event/mod.rs index c5f4863..f42fcee 100644 --- a/src/event/mod.rs +++ b/src/event/mod.rs @@ -1,8 +1,8 @@ use {Channel, User}; #[derive(Clone)] -pub enum Event<'a> { - Message { sender: User<'a>, channel: Option>, content: String }, - Join { channel: Channel<'a> }, - Quit { channel: Channel<'a> } +pub enum Event { + Message { sender: User, channel: Option, content: String }, + Join { channel: Channel }, + Quit { channel: Channel } } diff --git a/src/lib.rs b/src/lib.rs index bbc0db4..fb11dde 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -79,27 +79,38 @@ impl Tenquestionmarks { } #[derive(Clone)] -pub struct Channel<'a> { +pub struct Channel { name: String, description: String, topic: String, - send_function: &'a Fn(&Channel, &str) + sender: Box } -impl<'a> Channel<'a> { +impl Channel { pub fn send (&self, message: &str) { - (self.send_function)(self, message); + self.sender.send_message(message); } } #[derive(Clone)] -pub struct User<'a> { +pub struct User { name: String, - send_function: &'a Fn(&User, &str) + sender: Box } -impl<'a> User<'a> { +impl User { pub fn send (&self, message: &str) { - (self.send_function)(self, message); + self.sender.send_message(message); + } +} + +pub trait MessageSender : Sync + Send { + fn box_clone (&self) -> Box; + fn send_message (&self, message: &str) {} +} + +impl Clone for Box { + fn clone (&self) -> Box { + self.box_clone() } } diff --git a/src/plugins/discord.rs b/src/plugins/discord.rs index 13da6c3..662aeff 100644 --- a/src/plugins/discord.rs +++ b/src/plugins/discord.rs @@ -8,6 +8,7 @@ use toml::Table; use event; use std::sync::mpsc::Sender; +use MessageSender; use User; use Channel; @@ -29,6 +30,21 @@ impl DiscordPlugin { } } +#[derive(Clone)] +pub struct DiscordMessageSender { + name: String +} + +impl MessageSender for DiscordMessageSender { + fn box_clone (&self) -> Box { + Box::new((*self).clone()) + } + + fn send_message (&self, message: &str) { + println!("send to {:?}: {:?}", self.name, message); + } +} + impl Plugin for DiscordPlugin { fn produce_events<'a>(&'a self, sender: Sender) { let discord = Discord::from_bot_token(&self.token[..]).expect("Login failed"); @@ -36,10 +52,10 @@ impl Plugin for DiscordPlugin { loop { match connection.recv_event() { Ok(Event::MessageCreate(message)) => { - let author = User { + /*let author = User { name: message.author.name, - send_function: &(|user: &User, message: &str| { - println!("Send to {:?}: {:?}", user.name, message); + sender: &(DiscordMessageSender { + name: message.author.name }) }; @@ -47,12 +63,12 @@ impl Plugin for DiscordPlugin { name: String::from("channel"), description: String::from(""), topic: String::from(""), - send_function: &(|channel: &Channel, message: &str| { - println!("Send to {:?}: {:?}", channel.name, message); + sender: &(DiscordMessageSender { + name: String::from("channel") }) }; - sender.send(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) }); + sender.send(event::Event::Message { sender: author, content: message.content, channel: Option::Some(channel) });*/ } Ok(_) => {} Err(discord::Error::Closed(code, body)) => { diff --git a/src/plugins/stdin.rs b/src/plugins/stdin.rs index f897a45..812af17 100644 --- a/src/plugins/stdin.rs +++ b/src/plugins/stdin.rs @@ -4,12 +4,28 @@ use plugins::Plugin; use toml::Table; use User; +use MessageSender; use std::sync::mpsc::Sender; use event::Event; pub struct StdinPlugin {} +#[derive(Clone)] +pub struct StdinMessageSender { + name: String +} + +impl MessageSender for StdinMessageSender { + fn box_clone (&self) -> Box { + Box::new((*self).clone()) + } + + fn send_message (&self, message: &str) { + println!("send to {:?}: {:?}", self.name, message); + } +} + impl StdinPlugin { pub fn new (configuration: &Table) -> Box { Box::new(StdinPlugin {}) @@ -20,8 +36,8 @@ impl Plugin for StdinPlugin { fn produce_events<'a>(&'a self, sender: Sender) { let user = User { name: String::from("Dave"), - send_function: &(|user: &User, message: &str| { - println!("Send to {:?}: {:?}", user.name, message); + sender: Box::new(StdinMessageSender { + name: String::from("Dave") }) };