alternate implementation using Box<MessageSender> and clone

This commit is contained in:
Adrian Malacoda 2017-02-15 23:41:29 -06:00
parent 5b9f1610dd
commit 66180578d6
4 changed files with 63 additions and 20 deletions

View File

@ -1,8 +1,8 @@
use {Channel, User}; use {Channel, User};
#[derive(Clone)] #[derive(Clone)]
pub enum Event<'a> { pub enum Event {
Message { sender: User<'a>, channel: Option<Channel<'a>>, content: String }, Message { sender: User, channel: Option<Channel>, content: String },
Join { channel: Channel<'a> }, Join { channel: Channel },
Quit { channel: Channel<'a> } Quit { channel: Channel }
} }

View File

@ -79,27 +79,38 @@ impl Tenquestionmarks {
} }
#[derive(Clone)] #[derive(Clone)]
pub struct Channel<'a> { pub struct Channel {
name: String, name: String,
description: String, description: String,
topic: String, topic: String,
send_function: &'a Fn(&Channel, &str) sender: Box<MessageSender>
} }
impl<'a> Channel<'a> { impl Channel {
pub fn send (&self, message: &str) { pub fn send (&self, message: &str) {
(self.send_function)(self, message); self.sender.send_message(message);
} }
} }
#[derive(Clone)] #[derive(Clone)]
pub struct User<'a> { pub struct User {
name: String, name: String,
send_function: &'a Fn(&User, &str) sender: Box<MessageSender>
} }
impl<'a> User<'a> { impl User {
pub fn send (&self, message: &str) { 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<MessageSender>;
fn send_message (&self, message: &str) {}
}
impl Clone for Box<MessageSender> {
fn clone (&self) -> Box<MessageSender> {
self.box_clone()
} }
} }

View File

@ -8,6 +8,7 @@ use toml::Table;
use event; use event;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use MessageSender;
use User; use User;
use Channel; use Channel;
@ -29,6 +30,21 @@ impl DiscordPlugin {
} }
} }
#[derive(Clone)]
pub struct DiscordMessageSender {
name: String
}
impl MessageSender for DiscordMessageSender {
fn box_clone (&self) -> Box<MessageSender> {
Box::new((*self).clone())
}
fn send_message (&self, message: &str) {
println!("send to {:?}: {:?}", self.name, message);
}
}
impl Plugin for DiscordPlugin { impl Plugin for DiscordPlugin {
fn produce_events<'a>(&'a self, sender: Sender<event::Event>) { fn produce_events<'a>(&'a self, sender: Sender<event::Event>) {
let discord = Discord::from_bot_token(&self.token[..]).expect("Login failed"); let discord = Discord::from_bot_token(&self.token[..]).expect("Login failed");
@ -36,10 +52,10 @@ impl Plugin for DiscordPlugin {
loop { loop {
match connection.recv_event() { match connection.recv_event() {
Ok(Event::MessageCreate(message)) => { Ok(Event::MessageCreate(message)) => {
let author = User { /*let author = User {
name: message.author.name, name: message.author.name,
send_function: &(|user: &User, message: &str| { sender: &(DiscordMessageSender {
println!("Send to {:?}: {:?}", user.name, message); name: message.author.name
}) })
}; };
@ -47,12 +63,12 @@ impl Plugin for DiscordPlugin {
name: String::from("channel"), name: String::from("channel"),
description: String::from(""), description: String::from(""),
topic: String::from(""), topic: String::from(""),
send_function: &(|channel: &Channel, message: &str| { sender: &(DiscordMessageSender {
println!("Send to {:?}: {:?}", channel.name, message); 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(_) => {} Ok(_) => {}
Err(discord::Error::Closed(code, body)) => { Err(discord::Error::Closed(code, body)) => {

View File

@ -4,12 +4,28 @@ use plugins::Plugin;
use toml::Table; use toml::Table;
use User; use User;
use MessageSender;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use event::Event; use event::Event;
pub struct StdinPlugin {} pub struct StdinPlugin {}
#[derive(Clone)]
pub struct StdinMessageSender {
name: String
}
impl MessageSender for StdinMessageSender {
fn box_clone (&self) -> Box<MessageSender> {
Box::new((*self).clone())
}
fn send_message (&self, message: &str) {
println!("send to {:?}: {:?}", self.name, message);
}
}
impl StdinPlugin { impl StdinPlugin {
pub fn new (configuration: &Table) -> Box<Plugin> { pub fn new (configuration: &Table) -> Box<Plugin> {
Box::new(StdinPlugin {}) Box::new(StdinPlugin {})
@ -20,8 +36,8 @@ impl Plugin for StdinPlugin {
fn produce_events<'a>(&'a self, sender: Sender<Event>) { fn produce_events<'a>(&'a self, sender: Sender<Event>) {
let user = User { let user = User {
name: String::from("Dave"), name: String::from("Dave"),
send_function: &(|user: &User, message: &str| { sender: Box::new(StdinMessageSender {
println!("Send to {:?}: {:?}", user.name, message); name: String::from("Dave")
}) })
}; };