use crate::__private::HandlerError;
use crate::bot::Bot;
use crate::models::Update;
use crate::state::BotState;
use async_trait::async_trait;
use std::collections::btree_map::BTreeMap;
pub struct CommandHandler<T> {
pub name: String,
pub syntax: &'static str,
pub rank: u8,
pub handler: Box<dyn Handler<T>>,
}
pub fn group_commands<T>(commands: Vec<CommandHandler<T>>) -> BTreeMap<String, Vec<CommandHandler<T>>> {
commands.into_iter().fold(BTreeMap::new(), |mut map, cmd| {
if let Some(vec) = map.get_mut(&cmd.name) {
vec.push(cmd);
vec.sort_by_key(|c| c.rank);
} else {
map.insert(cmd.name.clone(), vec![cmd]);
}
map
})
}
#[async_trait]
pub trait Handler<T: Sync> {
async fn handle(&self, _: &[String], _: &Update, _: &Bot, _: Option<&BotState<T>>) -> Result<(), HandlerError>;
}