mod arg;
pub use arg::*;
use crate::context::MessageContext;
use crate::event::Permission;
use crate::handler::HandlerResult;
use async_trait::async_trait;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum CommandAction {
Done,
Continue,
}
impl CommandAction {
pub const fn done() -> HandlerResult<CommandAction> {
Ok(CommandAction::Done)
}
pub const fn r#continue() -> HandlerResult<CommandAction> {
Ok(CommandAction::Continue)
}
}
impl From<()> for CommandAction {
fn from(_: ()) -> Self {
CommandAction::Done
}
}
#[derive(Debug, Clone)]
pub struct Command<'c> {
pub name: &'c str,
pub description: Option<&'c str>,
pub args: Vec<Arg<'c>>,
pub rank: u32,
pub prefix: Option<String>,
pub alias: Vec<&'c str>,
pub permission: Permission,
}
#[async_trait]
pub trait CommandBuilder: Send + Sync + 'static {
fn name(&self) -> &'static str;
fn description(&self) -> Option<&'static str> {
None
}
fn args(&'_ self) -> Vec<Arg<'static>> {
Vec::new()
}
fn rank(&self) -> u32 {
500
}
fn alias(&self) -> Vec<&'static str> {
Vec::new()
}
fn permission(&self) -> Permission {
Permission::All
}
async fn run(&self, ctx: &MessageContext) -> HandlerResult<CommandAction>;
}