simplify even more; just return an EventLoop (will probably be renamed something like Handler)

This commit is contained in:
Adrian Malacoda 2018-02-22 02:50:49 -06:00
parent 5c87b9001a
commit ca6f3391d4
10 changed files with 57 additions and 92 deletions

View File

@ -1,4 +1,4 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use std::sync::Arc; use std::sync::Arc;
@ -19,12 +19,8 @@ use regex::Regex;
pub struct AutolinkModule {} pub struct AutolinkModule {}
impl AutolinkModule { impl AutolinkModule {
pub fn new (_: &Table, config: &Table) -> Module { pub fn new (_: &Table, config: &Table) -> Box<EventLoop> {
Module { Box::new(AutolinkModule {})
event_loop: Box::new(AutolinkModule {}),
module_type: String::from("autolink"),
config: config.clone()
}
} }
} }

View File

@ -2,12 +2,10 @@ use discord;
use discord::Discord; use discord::Discord;
use discord::model::{Event, PossibleServer}; use discord::model::{Event, PossibleServer};
use modules::Module;
use modules::EventLoop; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use event; use event;
use event::Envelope;
use std::sync::Arc; use std::sync::Arc;
use std::sync::mpsc::Receiver; use std::sync::mpsc::Receiver;
@ -26,7 +24,7 @@ pub struct DiscordModule {
const DEFAULT_PLAYING: &'static str = "tenquestionmarks 0.0.2"; const DEFAULT_PLAYING: &'static str = "tenquestionmarks 0.0.2";
impl DiscordModule { impl DiscordModule {
pub fn new (_: &Table, configuration: &Table) -> Module { pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
let token = configuration.get("token") let token = configuration.get("token")
.and_then(|value| value.as_str()) .and_then(|value| value.as_str())
.unwrap_or(""); .unwrap_or("");
@ -35,14 +33,10 @@ impl DiscordModule {
.and_then(|value| value.as_str()) .and_then(|value| value.as_str())
.unwrap_or(DEFAULT_PLAYING); .unwrap_or(DEFAULT_PLAYING);
Module { Box::new(DiscordModule {
module_type: String::from("Discord"), token: String::from(token),
event_loop: Box::new(DiscordModule { playing: String::from(playing)
token: String::from(token), })
playing: String::from(playing)
}),
config: configuration.clone()
}
} }
} }

View File

@ -1,4 +1,4 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use std::sync::Arc; use std::sync::Arc;
@ -13,18 +13,14 @@ pub struct EchoModule {
} }
impl EchoModule { impl EchoModule {
pub fn new (_: &Table, configuration: &Table) -> Module { pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
let prefix = configuration.get("prefix") let prefix = configuration.get("prefix")
.and_then(|value| value.as_str()) .and_then(|value| value.as_str())
.unwrap_or("!echo"); .unwrap_or("!echo");
Module { Box::new(EchoModule {
module_type: String::from("echo"), prefix: String::from(prefix)
event_loop: Box::new(EchoModule { })
prefix: String::from(prefix)
}),
config: configuration.clone()
}
} }
} }

View File

@ -1,4 +1,4 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use std::sync::Arc; use std::sync::Arc;
@ -15,7 +15,7 @@ pub struct EchoboxModule {
} }
impl EchoboxModule { impl EchoboxModule {
pub fn new (_: &Table, configuration: &Table) -> Module { pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
let prefix = configuration.get("prefix") let prefix = configuration.get("prefix")
.and_then(|value| value.as_str()) .and_then(|value| value.as_str())
.unwrap_or("?echobox"); .unwrap_or("?echobox");
@ -24,14 +24,10 @@ impl EchoboxModule {
.and_then(|value| value.as_str()) .and_then(|value| value.as_str())
.unwrap_or("echobox.db"); .unwrap_or("echobox.db");
Module { Box::new(EchoboxModule {
module_type: String::from("echo"), prefix: String::from(prefix),
event_loop: Box::new(EchoboxModule { file: String::from(file)
prefix: String::from(prefix), })
file: String::from(file)
}),
config: configuration.clone()
}
} }
} }

View File

@ -4,7 +4,7 @@ use std::fmt;
use toml::value::Table; use toml::value::Table;
use modules::Module; use modules::{Module, EventLoop};
use modules::discord::DiscordModule; use modules::discord::DiscordModule;
use modules::lua::LuaModule; use modules::lua::LuaModule;
use modules::stdin::StdinModule; use modules::stdin::StdinModule;
@ -16,21 +16,21 @@ use modules::autolink::AutolinkModule;
use modules::logger::LoggerModule; use modules::logger::LoggerModule;
pub struct ModuleLoader { pub struct ModuleLoader {
types: BTreeMap<&'static str, fn(&Table, &Table) -> Module> types: BTreeMap<&'static str, fn(&Table, &Table) -> Box<EventLoop>>
} }
impl ModuleLoader { impl ModuleLoader {
pub fn new () -> ModuleLoader { pub fn new () -> ModuleLoader {
let mut types = BTreeMap::new(); let mut types = BTreeMap::new();
types.insert("discord", DiscordModule::new as fn(&Table, &Table) -> Module); types.insert("discord", DiscordModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("lua", LuaModule::new as fn(&Table, &Table) -> Module); types.insert("lua", LuaModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("stdin", StdinModule::new as fn(&Table, &Table) -> Module); types.insert("stdin", StdinModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("echo", EchoModule::new as fn(&Table, &Table) -> Module); types.insert("echo", EchoModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("random", RandomModule::new as fn(&Table, &Table) -> Module); types.insert("random", RandomModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("pvn", PvnModule::new as fn(&Table, &Table) -> Module); types.insert("pvn", PvnModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("echobox", EchoboxModule::new as fn(&Table, &Table) -> Module); types.insert("echobox", EchoboxModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("autolink", AutolinkModule::new as fn(&Table, &Table) -> Module); types.insert("autolink", AutolinkModule::new as fn(&Table, &Table) -> Box<EventLoop>);
types.insert("logger", LoggerModule::new as fn(&Table, &Table) -> Module); types.insert("logger", LoggerModule::new as fn(&Table, &Table) -> Box<EventLoop>);
ModuleLoader { ModuleLoader {
types: types types: types
} }
@ -65,7 +65,11 @@ impl ModuleLoader {
.unwrap_or(name); .unwrap_or(name);
match self.types.get(module_type) { match self.types.get(module_type) {
Some(constructor) => Result::Ok(constructor(general_configuration, module_configuration)), Some(constructor) => Result::Ok(Module {
module_type: module_type.to_owned(),
config: module_configuration.clone(),
event_loop: constructor(general_configuration, module_configuration)
}),
None => Result::Err(ModuleLoaderError { message: format!("No such module type: {}", module_type) }) None => Result::Err(ModuleLoaderError { message: format!("No such module type: {}", module_type) })
} }
} }

View File

@ -1,22 +1,17 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use std::sync::Arc; use std::sync::Arc;
use std::sync::mpsc::Receiver; use std::sync::mpsc::Receiver;
use transformable_channels::mpsc::ExtSender; use transformable_channels::mpsc::ExtSender;
use helpers::command::split_command;
use event::{Event, Envelope}; use event::{Event, Envelope};
pub struct LoggerModule {} pub struct LoggerModule {}
impl LoggerModule { impl LoggerModule {
pub fn new (_: &Table, configuration: &Table) -> Module { pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
Module { Box::new(LoggerModule {})
module_type: String::from("logger"),
event_loop: Box::new(LoggerModule {}),
config: configuration.clone()
}
} }
} }

View File

@ -1,4 +1,4 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::Value; use toml::Value;
use toml::value::Table; use toml::value::Table;
@ -23,16 +23,12 @@ pub struct LuaModule {
} }
impl LuaModule { impl LuaModule {
pub fn new (_: &Table, config: &Table) -> Module { pub fn new (_: &Table, config: &Table) -> Box<EventLoop> {
Module { Box::new(LuaModule {
module_type: String::from("lua"), code: config.get("code").and_then(|value| value.as_str()).map(String::from),
event_loop: Box::new(LuaModule { file: config.get("file").and_then(|value| value.as_str()).map(String::from),
code: config.get("code").and_then(|value| value.as_str()).map(String::from), variables: config.clone()
file: config.get("file").and_then(|value| value.as_str()).map(String::from), })
variables: config.clone()
}),
config: config.clone()
}
} }
} }

View File

@ -1,4 +1,4 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use std::sync::Arc; use std::sync::Arc;
@ -17,12 +17,8 @@ use pvn::ninjas::{Ninja, Ninjas};
pub struct PvnModule {} pub struct PvnModule {}
impl PvnModule { impl PvnModule {
pub fn new (_: &Table, configuration: &Table) -> Module { pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
Module { Box::new(PvnModule {})
module_type: String::from("pvn"),
event_loop: Box::new(PvnModule {}),
config: configuration.clone()
}
} }
} }

View File

@ -1,4 +1,4 @@
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use std::sync::Arc; use std::sync::Arc;
@ -15,7 +15,7 @@ pub struct RandomModule {
} }
impl RandomModule { impl RandomModule {
pub fn new (_: &Table, configuration: &Table) -> Module { pub fn new (_: &Table, configuration: &Table) -> Box<EventLoop> {
let prefix = configuration.get("prefix") let prefix = configuration.get("prefix")
.and_then(|value| value.as_str()) .and_then(|value| value.as_str())
.unwrap_or("?random"); .unwrap_or("?random");
@ -28,14 +28,10 @@ impl RandomModule {
.map(|value| { String::from(value.as_str().unwrap()) }) .map(|value| { String::from(value.as_str().unwrap()) })
.collect(); .collect();
Module { Box::new(RandomModule {
module_type: String::from("random"), prefix: String::from(prefix),
event_loop: Box::new(RandomModule { responses: responses
prefix: String::from(prefix), })
responses: responses
}),
config: configuration.clone()
}
} }
} }

View File

@ -1,6 +1,6 @@
use std::io; use std::io;
use modules::{Module, EventLoop}; use modules::EventLoop;
use toml::value::Table; use toml::value::Table;
use {MessageSender, Message, User}; use {MessageSender, Message, User};
@ -26,12 +26,8 @@ impl MessageSender for StdinMessageSender {
} }
impl StdinModule { impl StdinModule {
pub fn new (_: &Table, config: &Table) -> Module { pub fn new (_: &Table, config: &Table) -> Box<EventLoop> {
Module { Box::new(StdinModule {})
module_type: String::from("stdin"),
event_loop: Box::new(StdinModule {}),
config: config.clone()
}
} }
} }