diff --git a/src/bots/approved_bot/modules/annotations/commands.rs b/src/bots/approved_bot/modules/annotations/commands.rs index 42b7976..80cd878 100644 --- a/src/bots/approved_bot/modules/annotations/commands.rs +++ b/src/bots/approved_bot/modules/annotations/commands.rs @@ -13,9 +13,8 @@ impl CommandParse for AnnotationCommand { fn parse(s: &str, bot_name: &str) -> Result { Regex::new(r"^/(?P[ab])_an_(?P\d+)$") .unwrap_or_else(|_| panic!("Broken AnnotationCommand regexp!")) - .captures( - &s.replace(&format!("@{bot_name}"), "") - ).ok_or(CommandParseError) + .captures(&s.replace(&format!("@{bot_name}"), "")) + .ok_or(CommandParseError) .map(|caps| ( caps["an_type"].to_string(), caps["id"].parse::().unwrap_or_else(|_| panic!("Can't get id from AnnotationCommand!")) diff --git a/src/bots/approved_bot/modules/annotations/mod.rs b/src/bots/approved_bot/modules/annotations/mod.rs index 9ad72a9..5d6e0bc 100644 --- a/src/bots/approved_bot/modules/annotations/mod.rs +++ b/src/bots/approved_bot/modules/annotations/mod.rs @@ -32,6 +32,7 @@ async fn download_image( Ok(reqwest::get(file).await?.error_for_status()?) } + pub async fn send_annotation_handler( message: Message, bot: CacheMe>, @@ -108,6 +109,7 @@ where Ok(()) } + pub async fn annotation_pagination_handler( cq: CallbackQuery, bot: CacheMe>, @@ -158,6 +160,7 @@ where Ok(()) } + pub fn get_annotations_handler() -> crate::bots::BotHandler { dptree::entry() .branch( diff --git a/src/bots/approved_bot/modules/book/callback_data.rs b/src/bots/approved_bot/modules/book/callback_data.rs index 91ab0d2..d64ca92 100644 --- a/src/bots/approved_bot/modules/book/callback_data.rs +++ b/src/bots/approved_bot/modules/book/callback_data.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use regex::Regex; -use crate::bots::approved_bot::modules::utils::pagination::GetPaginationCallbackData; +use crate::bots::approved_bot::modules::utils::{pagination::GetPaginationCallbackData, errors::CallbackQueryParseError}; #[derive(Clone)] @@ -13,27 +13,26 @@ pub enum BookCallbackData { } impl FromStr for BookCallbackData { - type Err = strum::ParseError; + type Err = CallbackQueryParseError; fn from_str(s: &str) -> Result { - let re = Regex::new(r"^b(?P[ats])_(?P\d+)_(?P\d+)$").unwrap(); - - let caps = re.captures(s); - let caps = match caps { - Some(v) => v, - None => return Err(strum::ParseError::VariantNotFound), - }; - - let annotation_type = &caps["an_type"]; - let id = caps["id"].parse::().unwrap(); - let page = caps["page"].parse::().unwrap(); - - match annotation_type { - "a" => Ok(BookCallbackData::Author { id, page }), - "t" => Ok(BookCallbackData::Translator { id, page }), - "s" => Ok(BookCallbackData::Sequence { id, page }), - _ => Err(strum::ParseError::VariantNotFound), - } + Regex::new(r"^b(?P[ats])_(?P\d+)_(?P\d+)$") + .unwrap_or_else(|_| panic!("Broken BookCallbackData regex pattern!")) + .captures(s) + .ok_or(CallbackQueryParseError) + .map(|caps| ( + caps["an_type"].to_string(), + caps["id"].parse::().unwrap(), + caps["page"].parse::().unwrap() + )) + .map(|(annotation_type, id, page)| + match annotation_type.as_str() { + "a" => Ok(BookCallbackData::Author { id, page }), + "t" => Ok(BookCallbackData::Translator { id, page }), + "s" => Ok(BookCallbackData::Sequence { id, page }), + _ => panic!("Unknown BookCallbackData type: {}!", annotation_type), + } + )? } } diff --git a/src/bots/approved_bot/modules/book/commands.rs b/src/bots/approved_bot/modules/book/commands.rs index 46b375c..d2b836d 100644 --- a/src/bots/approved_bot/modules/book/commands.rs +++ b/src/bots/approved_bot/modules/book/commands.rs @@ -12,25 +12,21 @@ pub enum BookCommand { impl CommandParse for BookCommand { fn parse(s: &str, bot_name: &str) -> Result { - let re = Regex::new(r"^/(?P[ats])_(?P\d+)$").unwrap(); - - let full_bot_name = format!("@{bot_name}"); - let after_replace = s.replace(&full_bot_name, ""); - - let caps = re.captures(&after_replace); - let caps = match caps { - Some(v) => v, - None => return Err(CommandParseError), - }; - - let annotation_type = &caps["an_type"]; - let id: u32 = caps["id"].parse().unwrap(); - - match annotation_type { - "a" => Ok(BookCommand::Author { id }), - "t" => Ok(BookCommand::Translator { id }), - "s" => Ok(BookCommand::Sequence { id }), - _ => Err(CommandParseError), - } + Regex::new(r"^/(?P[ats])_(?P\d+)$") + .unwrap_or_else(|_| panic!("Broken BookCommand regexp!")) + .captures(&s.replace(&format!("@{bot_name}"), "")) + .ok_or(CommandParseError) + .map(|caps| ( + caps["an_type"].to_string(), + caps["id"].parse().unwrap() + )) + .map(|(annotation_type, id)| { + match annotation_type.as_str() { + "a" => Ok(BookCommand::Author { id }), + "t" => Ok(BookCommand::Translator { id }), + "s" => Ok(BookCommand::Sequence { id }), + _ => panic!("Unknown BookCommand type: {}!", annotation_type), + } + })? } } diff --git a/src/bots/approved_bot/modules/download/callback_data.rs b/src/bots/approved_bot/modules/download/callback_data.rs index bd3c74d..3e869e8 100644 --- a/src/bots/approved_bot/modules/download/callback_data.rs +++ b/src/bots/approved_bot/modules/download/callback_data.rs @@ -3,6 +3,8 @@ use std::str::FromStr; use regex::Regex; use strum_macros::EnumIter; +use crate::bots::approved_bot::modules::utils::errors::CommandParseError; + #[derive(Clone, EnumIter)] pub enum DownloadQueryData { @@ -20,21 +22,20 @@ impl ToString for DownloadQueryData { } impl FromStr for DownloadQueryData { - type Err = strum::ParseError; + type Err = CommandParseError; fn from_str(s: &str) -> Result { - let re = Regex::new(r"^d_(?P\d+)_(?P\w+)$").unwrap(); - - let caps = re.captures(s); - let caps = match caps { - Some(v) => v, - None => return Err(strum::ParseError::VariantNotFound), - }; - - let book_id: u32 = caps["book_id"].parse().unwrap(); - let file_type: String = caps["file_type"].to_string(); - - Ok(DownloadQueryData::DownloadData { book_id, file_type }) + Regex::new(r"^d_(?P\d+)_(?P\w+)$") + .unwrap_or_else(|_| panic!("Broken DownloadQueryData regexp!")) + .captures(s) + .ok_or(CommandParseError) + .map(|caps| ( + caps["book_id"].parse().unwrap(), + caps["file_type"].to_string() + )) + .map(|(book_id, file_type)| { + DownloadQueryData::DownloadData { book_id, file_type } + }) } }