From 550b3218432c8a2ba478a62e751a45c1ada48d8f Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Tue, 14 Dec 2021 17:31:32 +0100
Subject: [PATCH] Group commandes into packages

---
 src/{cmd_acl.rs => cmd/acl.rs} |  0
 src/cmd/cmd.rs                 | 40 ++++++++++++++++++++++++++++++++++
 src/cmd/package.rs             | 34 +++++++++++++++++++++++++++++
 3 files changed, 74 insertions(+)
 rename src/{cmd_acl.rs => cmd/acl.rs} (100%)
 create mode 100644 src/cmd/cmd.rs
 create mode 100644 src/cmd/package.rs

diff --git a/src/cmd_acl.rs b/src/cmd/acl.rs
similarity index 100%
rename from src/cmd_acl.rs
rename to src/cmd/acl.rs
diff --git a/src/cmd/cmd.rs b/src/cmd/cmd.rs
new file mode 100644
index 0000000..75ac6ea
--- /dev/null
+++ b/src/cmd/cmd.rs
@@ -0,0 +1,40 @@
+use log::error;
+use std::{process::abort, string::String};
+
+#[allow(dead_code)]
+pub enum CmdHandler {
+    Simple(fn(Vec<String>) -> bool),
+    Echo(fn(Vec<String>) -> String),
+    MultiEcho(fn(Vec<String>) -> Vec<String>),
+}
+
+#[allow(dead_code)]
+pub struct Cmd {
+    name: String,
+    argc: u32,
+    handler: CmdHandler,
+}
+
+impl Cmd {
+    #[allow(dead_code)]
+    pub fn matches(&self, name: &String, args: &Vec<String>) -> bool {
+        (self.name == *name) && (self.argc as usize == args.len())
+    }
+
+    #[allow(dead_code)]
+    pub fn exec(&self, args: Vec<String>) -> String {
+        if args.len() != self.argc as usize {
+            error!("Arg count doesn't match");
+            abort();
+        }
+
+        match self.handler {
+            CmdHandler::Simple(f) => match f(args) {
+                true => "<b>Ok</b>".to_string(),
+                false => "<b>Failed!</b>".to_string(),
+            },
+            CmdHandler::Echo(f) => f(args),
+            CmdHandler::MultiEcho(f) => f(args).join("<br>---"),
+        }
+    }
+}
diff --git a/src/cmd/package.rs b/src/cmd/package.rs
new file mode 100644
index 0000000..2f2b1cd
--- /dev/null
+++ b/src/cmd/package.rs
@@ -0,0 +1,34 @@
+use crate::cmd::{
+    acl::{action_permited, CmdAcl, CmdAdminRegister},
+    cmd::Cmd,
+};
+use log::{error, info, warn};
+use matrix_sdk::{room::Room, ruma::UserId};
+
+pub struct CmdPackage {
+    name: String,
+    acl: CmdAcl,
+    admin_register: CmdAdminRegister,
+
+    commands: Vec<Cmd>,
+}
+
+impl CmdPackage {
+    #[allow(dead_code)]
+    pub fn handle(&self, room: &Room, user_id: &UserId, user_cmd: Vec<String>) -> String {
+        match action_permited(&self.admin_register, &self.acl, room, user_id) {
+            Err(string) => "Action not permited: ".to_string() + &string,
+            Ok(()) => match user_cmd.split_first() {
+                None => "No command was passed".to_string(),
+                Some((name, args)) => match self
+                    .commands
+                    .iter()
+                    .find(|x| x.matches(name, &args.to_vec()))
+                {
+                    None => "Command not found".to_string(),
+                    Some(command) => command.exec(args.to_vec()),
+                },
+            },
+        }
+    }
+}
-- 
GitLab