try arc instead of box

This commit is contained in:
Adrian Malacoda 2017-02-16 00:16:48 -06:00
parent b238b98b82
commit 7581521b61
3 changed files with 13 additions and 26 deletions

View File

@ -12,6 +12,7 @@ use plugins::loader::{PluginLoader, PluginLoaderError};
mod event; mod event;
use event::Event; use event::Event;
use std::sync::Arc;
use std::sync::mpsc; use std::sync::mpsc;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
@ -83,7 +84,7 @@ pub struct Channel {
name: String, name: String,
description: String, description: String,
topic: String, topic: String,
sender: Box<MessageSender> sender: Arc<MessageSender>
} }
impl Channel { impl Channel {
@ -95,7 +96,7 @@ impl Channel {
#[derive(Clone)] #[derive(Clone)]
pub struct User { pub struct User {
name: String, name: String,
sender: Box<MessageSender> sender: Arc<MessageSender>
} }
impl User { impl User {
@ -105,12 +106,5 @@ impl User {
} }
pub trait MessageSender : Sync + Send { pub trait MessageSender : Sync + Send {
fn box_clone (&self) -> Box<MessageSender>;
fn send_message (&self, message: &str) {} fn send_message (&self, message: &str) {}
} }
impl Clone for Box<MessageSender> {
fn clone (&self) -> Box<MessageSender> {
self.box_clone()
}
}

View File

@ -6,6 +6,8 @@ use plugins::Plugin;
use toml::Table; use toml::Table;
use event; use event;
use std::sync::Arc;
use std::sync::mpsc::Sender; use std::sync::mpsc::Sender;
use MessageSender; use MessageSender;
@ -28,18 +30,13 @@ impl DiscordPlugin {
} }
} }
#[derive(Clone)]
pub struct DiscordMessageSender { pub struct DiscordMessageSender {
name: String channel_id: discord::model::ChannelId
} }
impl MessageSender for DiscordMessageSender { impl MessageSender for DiscordMessageSender {
fn box_clone (&self) -> Box<MessageSender> {
Box::new((*self).clone())
}
fn send_message (&self, message: &str) { fn send_message (&self, message: &str) {
println!("send to {:?}: {:?}", self.name, message); println!("send to {:?}: {:?}", self.channel_id, message);
} }
} }
@ -52,8 +49,8 @@ impl Plugin for DiscordPlugin {
Ok(Event::MessageCreate(message)) => { Ok(Event::MessageCreate(message)) => {
let author = User { let author = User {
name: message.author.name.clone(), name: message.author.name.clone(),
sender: Box::new(DiscordMessageSender { sender: Arc::new(DiscordMessageSender {
name: message.author.name channel_id: message.channel_id
}) })
}; };
@ -61,8 +58,8 @@ impl Plugin for DiscordPlugin {
name: String::from("channel"), name: String::from("channel"),
description: String::from(""), description: String::from(""),
topic: String::from(""), topic: String::from(""),
sender: Box::new(DiscordMessageSender { sender: Arc::new(DiscordMessageSender {
name: String::from("channel") channel_id: message.channel_id
}) })
}; };

View File

@ -6,21 +6,17 @@ use toml::Table;
use User; use User;
use MessageSender; use MessageSender;
use std::sync::Arc;
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 { pub struct StdinMessageSender {
name: String name: String
} }
impl MessageSender for StdinMessageSender { impl MessageSender for StdinMessageSender {
fn box_clone (&self) -> Box<MessageSender> {
Box::new((*self).clone())
}
fn send_message (&self, message: &str) { fn send_message (&self, message: &str) {
println!("send to {:?}: {:?}", self.name, message); println!("send to {:?}: {:?}", self.name, message);
} }
@ -36,7 +32,7 @@ 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"),
sender: Box::new(StdinMessageSender { sender: Arc::new(StdinMessageSender {
name: String::from("Dave") name: String::from("Dave")
}) })
}; };