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(&section, 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(&section, pkg_commands_vec),
-- 
GitLab