From bdc01d04f9a18d2719dc314dd78e140fc6f7841c Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Sun, 3 Sep 2023 21:34:21 +0200 Subject: [PATCH] Refactor --- .../modules/search/callback_data.rs | 74 ++++++++++++++++++ .../modules/{search.rs => search/mod.rs} | 75 ++----------------- 2 files changed, 79 insertions(+), 70 deletions(-) create mode 100644 src/bots/approved_bot/modules/search/callback_data.rs rename src/bots/approved_bot/modules/{search.rs => search/mod.rs} (73%) diff --git a/src/bots/approved_bot/modules/search/callback_data.rs b/src/bots/approved_bot/modules/search/callback_data.rs new file mode 100644 index 0000000..9e52655 --- /dev/null +++ b/src/bots/approved_bot/modules/search/callback_data.rs @@ -0,0 +1,74 @@ +use std::str::FromStr; + +use regex::Regex; +use strum_macros::EnumIter; + +use crate::bots::approved_bot::modules::utils::GetPaginationCallbackData; + + +#[derive(Clone, EnumIter)] +pub enum SearchCallbackData { + Book { page: u32 }, + Authors { page: u32 }, + Sequences { page: u32 }, + Translators { page: u32 }, +} + +impl ToString for SearchCallbackData { + fn to_string(&self) -> String { + match self { + SearchCallbackData::Book { page } => format!("sb_{page}"), + SearchCallbackData::Authors { page } => format!("sa_{page}"), + SearchCallbackData::Sequences { page } => format!("ss_{page}"), + SearchCallbackData::Translators { page } => format!("st_{page}"), + } + } +} + +impl FromStr for SearchCallbackData { + type Err = strum::ParseError; + + fn from_str(s: &str) -> Result { + let re = Regex::new(r"^(?Ps[a|b|s|t])_(?P\d+)$").unwrap(); + + let caps = re.captures(s); + let caps = match caps { + Some(v) => v, + None => return Err(strum::ParseError::VariantNotFound), + }; + + let search_type = &caps["search_type"]; + let page: u32 = caps["page"].parse::().unwrap(); + + // Fix for migrate from old bot implementation + let page: u32 = std::cmp::max(1, page); + + match search_type { + "sb" => Ok(SearchCallbackData::Book { page }), + "sa" => Ok(SearchCallbackData::Authors { page }), + "ss" => Ok(SearchCallbackData::Sequences { page }), + "st" => Ok(SearchCallbackData::Translators { page }), + _ => Err(strum::ParseError::VariantNotFound), + } + } +} + +impl GetPaginationCallbackData for SearchCallbackData { + fn get_pagination_callback_data(&self, target_page: u32) -> String { + match self { + SearchCallbackData::Book { .. } => { + SearchCallbackData::Book { page: target_page } + } + SearchCallbackData::Authors { .. } => { + SearchCallbackData::Authors { page: target_page } + } + SearchCallbackData::Sequences { .. } => { + SearchCallbackData::Sequences { page: target_page } + } + SearchCallbackData::Translators { .. } => { + SearchCallbackData::Translators { page: target_page } + } + } + .to_string() + } +} diff --git a/src/bots/approved_bot/modules/search.rs b/src/bots/approved_bot/modules/search/mod.rs similarity index 73% rename from src/bots/approved_bot/modules/search.rs rename to src/bots/approved_bot/modules/search/mod.rs index f1d3196..f78de84 100644 --- a/src/bots/approved_bot/modules/search.rs +++ b/src/bots/approved_bot/modules/search/mod.rs @@ -1,11 +1,9 @@ -use core::fmt::Debug; -use std::str::FromStr; +pub mod callback_data; +use core::fmt::Debug; use smartstring::alias::String as SmartString; -use regex::Regex; use smallvec::SmallVec; -use strum_macros::EnumIter; use teloxide::{ prelude::*, types::{InlineKeyboardButton, InlineKeyboardMarkup}, dispatching::dialogue::GetChatId, adaptors::{Throttle, CacheMe}, @@ -25,74 +23,10 @@ use crate::bots::{ BotHandlerInternal, }; -use super::utils::{generic_get_pagination_keyboard, GetPaginationCallbackData}; +use self::callback_data::SearchCallbackData; -#[derive(Clone, EnumIter)] -pub enum SearchCallbackData { - Book { page: u32 }, - Authors { page: u32 }, - Sequences { page: u32 }, - Translators { page: u32 }, -} +use super::utils::generic_get_pagination_keyboard; -impl ToString for SearchCallbackData { - fn to_string(&self) -> String { - match self { - SearchCallbackData::Book { page } => format!("sb_{page}"), - SearchCallbackData::Authors { page } => format!("sa_{page}"), - SearchCallbackData::Sequences { page } => format!("ss_{page}"), - SearchCallbackData::Translators { page } => format!("st_{page}"), - } - } -} - -impl FromStr for SearchCallbackData { - type Err = strum::ParseError; - - fn from_str(s: &str) -> Result { - let re = Regex::new(r"^(?Ps[a|b|s|t])_(?P\d+)$").unwrap(); - - let caps = re.captures(s); - let caps = match caps { - Some(v) => v, - None => return Err(strum::ParseError::VariantNotFound), - }; - - let search_type = &caps["search_type"]; - let page: u32 = caps["page"].parse::().unwrap(); - - // Fix for migrate from old bot implementation - let page: u32 = std::cmp::max(1, page); - - match search_type { - "sb" => Ok(SearchCallbackData::Book { page }), - "sa" => Ok(SearchCallbackData::Authors { page }), - "ss" => Ok(SearchCallbackData::Sequences { page }), - "st" => Ok(SearchCallbackData::Translators { page }), - _ => Err(strum::ParseError::VariantNotFound), - } - } -} - -impl GetPaginationCallbackData for SearchCallbackData { - fn get_pagination_callback_data(&self, target_page: u32) -> String { - match self { - SearchCallbackData::Book { .. } => { - SearchCallbackData::Book { page: target_page } - } - SearchCallbackData::Authors { .. } => { - SearchCallbackData::Authors { page: target_page } - } - SearchCallbackData::Sequences { .. } => { - SearchCallbackData::Sequences { page: target_page } - } - SearchCallbackData::Translators { .. } => { - SearchCallbackData::Translators { page: target_page } - } - } - .to_string() - } -} fn get_query(cq: CallbackQuery) -> Option { cq.message @@ -109,6 +43,7 @@ fn get_query(cq: CallbackQuery) -> Option { .unwrap_or(None) } + async fn generic_search_pagination_handler( cq: CallbackQuery, bot: CacheMe>,