From eb275b9decb7583e449709a26e3acdd5cedcd15f Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Tue, 26 Sep 2023 18:51:02 +0200 Subject: [PATCH] Refactor book callback data parsers --- .../modules/download/callback_data.rs | 59 +++++++++---------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/bots/approved_bot/modules/download/callback_data.rs b/src/bots/approved_bot/modules/download/callback_data.rs index dcff68f..0f2f191 100644 --- a/src/bots/approved_bot/modules/download/callback_data.rs +++ b/src/bots/approved_bot/modules/download/callback_data.rs @@ -3,7 +3,9 @@ use std::str::FromStr; use regex::Regex; use strum_macros::EnumIter; -use crate::bots::approved_bot::modules::utils::errors::CommandParseError; +use crate::bots::approved_bot::modules::utils::errors::{ + CallbackQueryParseError, CommandParseError, +}; #[derive(Clone, EnumIter)] pub enum DownloadQueryData { @@ -60,26 +62,26 @@ impl ToString for DownloadArchiveQueryData { } impl FromStr for DownloadArchiveQueryData { - type Err = strum::ParseError; + type Err = CallbackQueryParseError; fn from_str(s: &str) -> Result { - let re = Regex::new(r"^da_(?P[sat])_(?P\d+)_(?P\w+)$").unwrap(); - - let caps = re.captures(s); - let caps = match caps { - Some(v) => v, - None => return Err(strum::ParseError::VariantNotFound), - }; - - let id: u32 = caps["id"].parse().unwrap(); - let file_type: String = caps["file_type"].to_string(); - - Ok(match caps["obj_type"].to_string().as_str() { - "s" => DownloadArchiveQueryData::Sequence { id, file_type }, - "a" => DownloadArchiveQueryData::Author { id, file_type }, - "t" => DownloadArchiveQueryData::Translator { id, file_type }, - _ => return Err(strum::ParseError::VariantNotFound), - }) + Regex::new(r"^da_(?P[sat])_(?P\d+)_(?P\w+)$") + .unwrap_or_else(|_| panic!("Broken BookCallbackData regex pattern!")) + .captures(s) + .ok_or(CallbackQueryParseError) + .map(|caps| { + ( + caps["id"].parse().unwrap(), + caps["file_type"].to_string(), + caps["obj_type"].to_string(), + ) + }) + .map(|(id, file_type, obj_type)| match obj_type.as_str() { + "s" => DownloadArchiveQueryData::Sequence { id, file_type }, + "a" => DownloadArchiveQueryData::Author { id, file_type }, + "t" => DownloadArchiveQueryData::Translator { id, file_type }, + _ => panic!("Unknown DownloadArchiveQueryData type: {}!", obj_type), + }) } } @@ -95,19 +97,14 @@ impl ToString for CheckArchiveStatus { } impl FromStr for CheckArchiveStatus { - type Err = strum::ParseError; + type Err = CallbackQueryParseError; fn from_str(s: &str) -> Result { - let re = Regex::new(r"^check_da_(?P\w+)$").unwrap(); - - let caps = re.captures(s); - let caps = match caps { - Some(v) => v, - None => return Err(strum::ParseError::VariantNotFound), - }; - - let task_id: String = caps["task_id"].parse().unwrap(); - - Ok(CheckArchiveStatus { task_id }) + Regex::new(r"^check_da_(?P\w+)$") + .unwrap_or_else(|_| panic!("Broken CheckArchiveStatus regex pattern!")) + .captures(s) + .ok_or(CallbackQueryParseError) + .map(|caps| caps["task_id"].parse().unwrap()) + .map(|task_id| CheckArchiveStatus { task_id }) } }