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