From 8974cb27094aa0b3b4b69b28935200b414a31c22 Mon Sep 17 00:00:00 2001 From: Kubat <mael.martin31@gmail.com> Date: Wed, 15 Dec 2021 19:11:02 +0100 Subject: [PATCH] Refactor: split the connect_and_handle function --- src/cmd/mod.rs | 47 +++++++++++++++++++++++----------------------- src/cmd/package.rs | 1 - src/main.rs | 5 +++-- src/matrix.rs | 6 +++--- 4 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/cmd/mod.rs b/src/cmd/mod.rs index 1637d1c..e4da64f 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 20cb0d6..206611a 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 d48e70c..12fc610 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 7a6e937..2b031f1 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), -- GitLab