diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 1637d1cd5ceab6f577813f1cc5cc6e0158bd7767..e4da64fa9a512adb9f86cad8d982c1946722b95f 100644 --- a/src/cmd/mod.rs +++ b/src/cmd/mod.rs @@ -4,16 +4,18 @@ pub mod acl; pub mod package; use log::error; -use std::{process::abort, string::String, sync::Arc}; +use std::{boxed::Box, process::abort, string::String}; + +trait CmdFnSimple = Fn(Vec<&str>) -> bool + Send + Sync; +trait CmdFnEcho = Fn(Vec<&str>) -> String + Send + Sync; +trait CmdFnMultiEcho = Fn(Vec<&str>) -> Vec<String> + Send + Sync; -#[derive(Clone)] enum CmdHandler { - Simple(Arc<dyn Fn(Vec<&str>) -> bool + Send + Sync>), - Echo(Arc<dyn Fn(Vec<&str>) -> String + Send + Sync>), - MultiEcho(Arc<dyn Fn(Vec<&str>) -> Vec<String> + Send + Sync>), + Simple(Box<dyn CmdFnSimple>), + Echo(Box<dyn CmdFnEcho>), + MultiEcho(Box<dyn CmdFnMultiEcho>), } -#[derive(Clone)] pub struct Cmd { name: String, argc: u32, @@ -45,39 +47,36 @@ impl Cmd { &self.name } - pub fn new_simple( - name: String, - argc: u32, - f: Arc<dyn Fn(Vec<&str>) -> bool + Send + Sync>, - ) -> Cmd { + pub fn new_simple<F: 'static>(name: String, argc: u32, f: F) -> Cmd + where + F: Fn(Vec<&str>) -> bool + Send + Sync, + { Cmd { name: name, argc: argc, - handler: CmdHandler::Simple(f), + handler: CmdHandler::Simple(Box::new(f)), } } - pub fn new_echo( - name: String, - argc: u32, - f: Arc<dyn Fn(Vec<&str>) -> String + Send + Sync>, - ) -> Cmd { + pub fn new_echo<F: 'static>(name: String, argc: u32, f: F) -> Cmd + where + F: Fn(Vec<&str>) -> String + Send + Sync, + { Cmd { name: name, argc: argc, - handler: CmdHandler::Echo(f), + handler: CmdHandler::Echo(Box::new(f)), } } - pub fn new_multi_echo( - name: String, - argc: u32, - f: Arc<dyn Fn(Vec<&str>) -> Vec<String> + Send + Sync>, - ) -> Cmd { + pub fn new_multi_echo<F: 'static>(name: String, argc: u32, f: F) -> Cmd + where + F: Fn(Vec<&str>) -> Vec<String> + Send + Sync, + { Cmd { name: name, argc: argc, - handler: CmdHandler::MultiEcho(f), + handler: CmdHandler::MultiEcho(Box::new(f)), } } } diff --git a/src/cmd/package.rs b/src/cmd/package.rs index 20cb0d6e0df6e200b5925aa0fe087ccc355c7f23..206611a1969631068be6f59af06ad323eef07ffa 100644 --- a/src/cmd/package.rs +++ b/src/cmd/package.rs @@ -6,7 +6,6 @@ use ini::Properties as IniSection; use matrix_sdk::{room::Joined as JoinedRoom, ruma::UserId}; use std::{convert::TryFrom, fmt}; -#[derive(Clone)] pub struct CmdPackage { name: String, acl: CmdAcl, diff --git a/src/main.rs b/src/main.rs index d48e70cf41caf2909fda31da4755683caf87d1ea..12fc6106caca25c20a7699d2e09c635d9aa6585b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -#![feature(new_uninit, once_cell)] +#![feature(new_uninit, once_cell, trait_alias)] mod cmd; mod config; @@ -20,7 +20,8 @@ async fn main() -> matrix_sdk::Result<()> { ]; matrix::Bot::new(env::args().last().unwrap()) - .connect().await? + .connect() + .await? .add_package(format!("basic"), basic_cmds) .listen() .await diff --git a/src/matrix.rs b/src/matrix.rs index 7a6e9378df7753b987eb1ade482cd821362a3ccf..2b031f1259f680cafa3c530f322d09be9f7aa069 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -232,7 +232,7 @@ impl Bot { } pub fn add_package(&self, name: String, cmds: Vec<Cmd>) -> &Self { - let pkg = match self.config.section("basic") { + let pkg = match self.config.section(&name) { Some(section) => CmdPackage::from_config(§ion, cmds), None => { abort(); @@ -245,8 +245,8 @@ impl Bot { pub async fn connect_and_handle(config: Config) -> Result<()> { // TODO: Refactor let pkg_commands_vec = vec![ - Cmd::new_simple(format!("ping"), 0, Arc::new(|_x| true)), - Cmd::new_echo(format!("bot_name"), 0, Arc::new(move |_x| format!("toto"))), + Cmd::new_simple(format!("ping"), 0, |_x| true), + Cmd::new_echo(format!("bot_name"), 0, |_x| format!("toto")), ]; let pkg = match config.section("basic") { Some(section) => CmdPackage::from_config(§ion, pkg_commands_vec),