use MessageAnswererError in message_answerer.rs

This commit is contained in:
Akulij 2025-06-07 02:56:17 +05:00
parent 3c0ae02139
commit c3386a1e2f

View File

@ -8,7 +8,7 @@ use teloxide::{
Bot, Bot,
}; };
use crate::db::Media; use crate::db::{DbError, DbResult, Media};
use crate::{ use crate::{
db::{CallDB, DB}, db::{CallDB, DB},
notify_admin, BotResult, notify_admin, BotResult,
@ -40,6 +40,16 @@ pub struct MessageAnswerer<'a> {
db: &'a mut DB, db: &'a mut DB,
} }
#[derive(thiserror::Error, Debug)]
pub enum MessageAnswererError {
#[error("Failed request to DB: {0:?}")]
DbError(#[from] DbError),
#[error("Failed teloxide request: {0:?}")]
RequestError(#[from] teloxide::RequestError),
}
pub type MAResult<T> = Result<T, MessageAnswererError>;
impl<'a> MessageAnswerer<'a> { impl<'a> MessageAnswerer<'a> {
pub fn new(bot: &'a Bot, db: &'a mut DB, chat_id: i64) -> Self { pub fn new(bot: &'a Bot, db: &'a mut DB, chat_id: i64) -> Self {
Self { bot, chat_id, db } Self { bot, chat_id, db }
@ -50,7 +60,7 @@ impl<'a> MessageAnswerer<'a> {
literal: &str, literal: &str,
variant: Option<&str>, variant: Option<&str>,
is_replace: bool, is_replace: bool,
) -> BotResult<String> { ) -> DbResult<String> {
let variant_text = match variant { let variant_text = match variant {
Some(variant) => { Some(variant) => {
let value = self let value = self
@ -81,7 +91,7 @@ impl<'a> MessageAnswerer<'a> {
literal: &str, literal: &str,
variant: Option<&str>, variant: Option<&str>,
keyboard: Option<InlineKeyboardMarkup>, keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<(i64, i32)> { ) -> MAResult<(i64, i32)> {
let text = self.get_text(literal, variant, false).await?; let text = self.get_text(literal, variant, false).await?;
self.answer_inner(text, literal, variant, keyboard).await self.answer_inner(text, literal, variant, keyboard).await
} }
@ -90,8 +100,10 @@ impl<'a> MessageAnswerer<'a> {
self, self,
text: String, text: String,
keyboard: Option<InlineKeyboardMarkup>, keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<(i64, i32)> { ) -> MAResult<(i64, i32)> {
self.send_message(text, keyboard).await self.send_message(text, keyboard)
.await
.map_err(MessageAnswererError::from)
} }
async fn answer_inner( async fn answer_inner(
@ -100,7 +112,7 @@ impl<'a> MessageAnswerer<'a> {
literal: &str, literal: &str,
variant: Option<&str>, variant: Option<&str>,
keyboard: Option<InlineKeyboardMarkup>, keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<(i64, i32)> { ) -> MAResult<(i64, i32)> {
let media = self.db.get_media(literal).await?; let media = self.db.get_media(literal).await?;
let (chat_id, msg_id) = match media.len() { let (chat_id, msg_id) = match media.len() {
// just a text // just a text
@ -119,7 +131,7 @@ impl<'a> MessageAnswerer<'a> {
message_id: i32, message_id: i32,
literal: &str, literal: &str,
keyboard: Option<InlineKeyboardMarkup>, keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<()> { ) -> MAResult<()> {
let variant = self let variant = self
.db .db
.get_message(self.chat_id, message_id) .get_message(self.chat_id, message_id)
@ -203,7 +215,7 @@ impl<'a> MessageAnswerer<'a> {
message_id: i32, message_id: i32,
literal: &str, literal: &str,
variant: Option<&str>, variant: Option<&str>,
) -> BotResult<()> { ) -> DbResult<()> {
match variant { match variant {
Some(variant) => { Some(variant) => {
self.db self.db
@ -224,7 +236,7 @@ impl<'a> MessageAnswerer<'a> {
&self, &self,
text: String, text: String,
keyboard: Option<InlineKeyboardMarkup>, keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<(i64, i32)> { ) -> Result<(i64, i32), teloxide::RequestError> {
let msg = self.bot.send_message(ChatId(self.chat_id), text); let msg = self.bot.send_message(ChatId(self.chat_id), text);
let msg = match keyboard { let msg = match keyboard {
Some(kbd) => msg.reply_markup(kbd), Some(kbd) => msg.reply_markup(kbd),
@ -242,7 +254,7 @@ impl<'a> MessageAnswerer<'a> {
media: &Media, media: &Media,
text: String, text: String,
keyboard: Option<InlineKeyboardMarkup>, keyboard: Option<InlineKeyboardMarkup>,
) -> BotResult<(i64, i32)> { ) -> Result<(i64, i32), teloxide::RequestError> {
match media.media_type.as_str() { match media.media_type.as_str() {
"photo" => { "photo" => {
send_media!( send_media!(
@ -270,7 +282,11 @@ impl<'a> MessageAnswerer<'a> {
} }
} }
async fn send_media_group(&self, media: Vec<Media>, text: String) -> BotResult<(i64, i32)> { async fn send_media_group(
&self,
media: Vec<Media>,
text: String,
) -> Result<(i64, i32), teloxide::RequestError> {
let media: Vec<InputMedia> = media let media: Vec<InputMedia> = media
.into_iter() .into_iter()
.enumerate() .enumerate()