diff --git a/src/handlers/commands/add_account.rs b/src/handlers/commands/add_account.rs index ce731ab..c7abeba 100644 --- a/src/handlers/commands/add_account.rs +++ b/src/handlers/commands/add_account.rs @@ -1,7 +1,7 @@ use crate::{ entity::prelude::Account, errors::NoUserInfo, - handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State}, + handlers::{markups::deletion_markup, Handler, MainDialogue, State}, models::DecryptedAccount, }; use sea_orm::prelude::*; @@ -46,7 +46,7 @@ async fn get_password( password, }; dialogue - .update(State::GetMasterPass(package_handler( + .update(State::GetMasterPass(Handler::new( move |bot, msg, db, dialogue, master_pass| { get_master_pass(bot, msg, db, dialogue, account, master_pass) }, @@ -67,7 +67,7 @@ async fn get_login( ) -> crate::Result<()> { let previous = bot.send_message(msg.chat.id, "Send password").await?; dialogue - .update(State::GetPassword(package_handler( + .update(State::GetPassword(Handler::new( move |bot, msg, db, dialogue, password| { get_password(bot, msg, db, dialogue, name, login, password) }, @@ -94,7 +94,7 @@ async fn get_account_name( } let previous = bot.send_message(msg.chat.id, "Send login").await?; dialogue - .update(State::GetLogin(package_handler( + .update(State::GetLogin(Handler::new( move |bot, msg, db, dialogue, login| get_login(bot, msg, db, dialogue, name, login), previous, ))) @@ -110,7 +110,7 @@ pub async fn add_account( ) -> crate::Result<()> { let previous = bot.send_message(msg.chat.id, "Send account name").await?; dialogue - .update(State::GetAccountName(package_handler( + .update(State::GetAccountName(Handler::new( get_account_name, previous, ))) diff --git a/src/handlers/commands/delete.rs b/src/handlers/commands/delete.rs index 27b2780..e4027fc 100644 --- a/src/handlers/commands/delete.rs +++ b/src/handlers/commands/delete.rs @@ -3,8 +3,7 @@ use crate::{ errors::NoUserInfo, handlers::{ markups::{self, deletion_markup}, - utils::package_handler, - MainDialogue, State, + Handler, MainDialogue, State, }, }; use sea_orm::prelude::*; @@ -47,7 +46,7 @@ async fn get_account_name( .send_message(msg.chat.id, "Send master password. Once you send correct master password the account is unrecoverable") .await?; dialogue - .update(State::GetMasterPass(package_handler( + .update(State::GetMasterPass(Handler::new( move |bot, msg, db, dialogue, _| get_master_pass(bot, msg, db, dialogue, name), previous, ))) @@ -69,7 +68,7 @@ pub async fn delete( .reply_markup(markup) .await?; dialogue - .update(State::GetAccountName(package_handler( + .update(State::GetAccountName(Handler::new( get_account_name, previous, ))) diff --git a/src/handlers/commands/delete_all.rs b/src/handlers/commands/delete_all.rs index 2240be2..843e086 100644 --- a/src/handlers/commands/delete_all.rs +++ b/src/handlers/commands/delete_all.rs @@ -1,7 +1,7 @@ use crate::{ entity::prelude::*, errors::NoUserInfo, - handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State}, + handlers::{markups::deletion_markup, Handler, MainDialogue, State}, }; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; @@ -38,7 +38,7 @@ pub async fn delete_all( ) .await?; dialogue - .update(State::GetMasterPass(package_handler( + .update(State::GetMasterPass(Handler::new( get_master_pass, previous, ))) diff --git a/src/handlers/commands/export.rs b/src/handlers/commands/export.rs index cabb9e6..a1422d9 100644 --- a/src/handlers/commands/export.rs +++ b/src/handlers/commands/export.rs @@ -1,7 +1,7 @@ use crate::{ entity::prelude::Account, errors::NoUserInfo, - handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State}, + handlers::{markups::deletion_markup, Handler, MainDialogue, State}, models::{DecryptedAccount, User}, }; use futures::TryStreamExt; @@ -55,7 +55,7 @@ pub async fn export(bot: Throttle, msg: Message, dialogue: MainDialogue) -> .send_message(msg.chat.id, "Send a master password to export the accounts") .await?; dialogue - .update(State::GetMasterPass(package_handler( + .update(State::GetMasterPass(Handler::new( move |bot, msg, db, dialogue, master_pass| { get_master_pass(bot, msg, db, dialogue, master_pass) }, diff --git a/src/handlers/commands/get_account.rs b/src/handlers/commands/get_account.rs index 0146749..117a93c 100644 --- a/src/handlers/commands/get_account.rs +++ b/src/handlers/commands/get_account.rs @@ -3,8 +3,7 @@ use crate::{ errors::NoUserInfo, handlers::{ markups::{self, deletion_markup}, - utils::package_handler, - MainDialogue, State, + Handler, MainDialogue, State, }, }; use sea_orm::prelude::*; @@ -59,7 +58,7 @@ async fn get_account_name( .send_message(msg.chat.id, "Send master password") .await?; dialogue - .update(State::GetMasterPass(package_handler( + .update(State::GetMasterPass(Handler::new( move |bot, msg, db, dialogue, master_pass| { get_master_pass(bot, msg, db, dialogue, name, master_pass) }, @@ -83,7 +82,7 @@ pub async fn get_account( .reply_markup(markup) .await?; dialogue - .update(State::GetAccountName(package_handler( + .update(State::GetAccountName(Handler::new( get_account_name, previous, ))) diff --git a/src/handlers/commands/import.rs b/src/handlers/commands/import.rs index 89018b0..0188de6 100644 --- a/src/handlers/commands/import.rs +++ b/src/handlers/commands/import.rs @@ -1,6 +1,6 @@ use crate::{ errors::NoUserInfo, - handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State}, + handlers::{markups::deletion_markup, Handler, MainDialogue, State}, models::{DecryptedAccount, User}, }; use futures::{future, stream::FuturesUnordered, StreamExt, TryStreamExt}; @@ -105,7 +105,7 @@ async fn get_document( .send_message(msg.chat.id, "Send master password") .await?; dialogue - .update(State::GetMasterPass(package_handler( + .update(State::GetMasterPass(Handler::new( move |bot, msg, db, dialogue, master_pass| { get_master_pass(bot, msg, db, dialogue, master_pass, accounts) }, @@ -124,7 +124,7 @@ pub async fn import(bot: Throttle, msg: Message, dialogue: MainDialogue) -> ) .await?; dialogue - .update(State::GetDocument(package_handler(get_document, previous))) + .update(State::GetDocument(Handler::new(get_document, previous))) .await?; Ok(()) } diff --git a/src/handlers/commands/set_master_pass.rs b/src/handlers/commands/set_master_pass.rs index 8a93f17..9d553d3 100644 --- a/src/handlers/commands/set_master_pass.rs +++ b/src/handlers/commands/set_master_pass.rs @@ -1,7 +1,7 @@ use crate::{ entity::prelude::*, errors::NoUserInfo, - handlers::{markups::deletion_markup, utils::package_handler, MainDialogue, State}, + handlers::{markups::deletion_markup, Handler, MainDialogue, State}, }; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; @@ -46,10 +46,7 @@ pub async fn set_master_pass( .send_message(msg.chat.id, "Send new master password") .await?; dialogue - .update(State::GetPassword(package_handler( - get_master_pass, - previous, - ))) + .update(State::GetPassword(Handler::new(get_master_pass, previous))) .await?; Ok(()) } diff --git a/src/handlers/mod.rs b/src/handlers/mod.rs index 87977c3..7ac35ce 100644 --- a/src/handlers/mod.rs +++ b/src/handlers/mod.rs @@ -6,7 +6,7 @@ mod state; mod utils; use sea_orm::prelude::*; -use std::sync::Arc; +use state::{Handler, PackagedHandler}; use teloxide::{ adaptors::{throttle::Limits, Throttle}, dispatching::dialogue::InMemStorage, @@ -14,29 +14,9 @@ use teloxide::{ prelude::*, utils::command::BotCommands, }; -use tokio::sync::Mutex; type MainDialogue = Dialogue>; -#[allow(clippy::type_complexity)] -pub struct Handler { - pub handler: Box< - dyn FnOnce( - Throttle, - Message, - DatabaseConnection, - MainDialogue, - T, - ) -> crate::PinnedFuture<'static, crate::Result<()>> - + Send - + Sync, - >, - - pub previous: Option, -} - -type PackagedHandler = Arc>>>; - #[derive(BotCommands, Clone, Copy)] #[command( rename_rule = "snake_case", diff --git a/src/handlers/state/generic.rs b/src/handlers/state/generic.rs index 3d4ee81..a60c38b 100644 --- a/src/handlers/state/generic.rs +++ b/src/handlers/state/generic.rs @@ -14,7 +14,7 @@ pub async fn generic( db: DatabaseConnection, dialogue: crate::handlers::MainDialogue, check: F, - next: crate::handlers::PackagedHandler, + next: super::PackagedHandler, ) -> crate::Result<()> where for<'a> F: FnOnce( diff --git a/src/handlers/state/get_account_name.rs b/src/handlers/state/get_account_name.rs index 1e271d2..ca35245 100644 --- a/src/handlers/state/get_account_name.rs +++ b/src/handlers/state/get_account_name.rs @@ -1,17 +1,14 @@ +use crate::handlers::{markups::deletion_markup, utils::validate_field, MainDialogue}; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; -use crate::handlers::{ - markups::deletion_markup, utils::validate_field, MainDialogue, PackagedHandler, -}; - /// Function to handle GetAccountName state pub async fn get_account_name( bot: Throttle, msg: Message, db: DatabaseConnection, dialogue: MainDialogue, - next: PackagedHandler, + next: super::PackagedHandler, ) -> crate::Result<()> { super::generic::generic( bot, diff --git a/src/handlers/state/get_document.rs b/src/handlers/state/get_document.rs index 6e46e9d..494329f 100644 --- a/src/handlers/state/get_document.rs +++ b/src/handlers/state/get_document.rs @@ -1,6 +1,6 @@ use crate::{ errors::HandlerUsed, - handlers::{markups::deletion_markup, utils::delete_optional, MainDialogue, PackagedHandler}, + handlers::{markups::deletion_markup, utils::delete_optional, MainDialogue}, }; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; @@ -11,7 +11,7 @@ pub async fn get_document( msg: Message, db: DatabaseConnection, dialogue: MainDialogue, - next: PackagedHandler<()>, + next: super::PackagedHandler<()>, ) -> crate::Result<()> { let handler = next.lock().await.take(); let previous = handler.as_ref().and_then(|h| h.previous.as_ref()); diff --git a/src/handlers/state/get_login.rs b/src/handlers/state/get_login.rs index 2e2e538..0605977 100644 --- a/src/handlers/state/get_login.rs +++ b/src/handlers/state/get_login.rs @@ -1,17 +1,14 @@ +use crate::handlers::{markups::deletion_markup, utils::validate_field, MainDialogue}; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; -use crate::handlers::{ - markups::deletion_markup, utils::validate_field, MainDialogue, PackagedHandler, -}; - /// Function to handle GetLogin state pub async fn get_login( bot: Throttle, msg: Message, db: DatabaseConnection, dialogue: MainDialogue, - next: PackagedHandler, + next: super::PackagedHandler, ) -> crate::Result<()> { super::generic::generic( bot, diff --git a/src/handlers/state/get_master_pass.rs b/src/handlers/state/get_master_pass.rs index bfcaf49..23d7150 100644 --- a/src/handlers/state/get_master_pass.rs +++ b/src/handlers/state/get_master_pass.rs @@ -1,7 +1,7 @@ use crate::{ entity::prelude::MasterPass, - errors::{NoUserInfo}, - handlers::{markups::deletion_markup, MainDialogue, PackagedHandler}, + errors::NoUserInfo, + handlers::{markups::deletion_markup, MainDialogue}, }; use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; @@ -39,7 +39,7 @@ pub async fn get_master_pass( msg: Message, db: DatabaseConnection, dialogue: MainDialogue, - next: PackagedHandler, + next: super::PackagedHandler, ) -> crate::Result<()> { super::generic::generic( bot, diff --git a/src/handlers/state/get_password.rs b/src/handlers/state/get_password.rs index bd9c34a..98f67f3 100644 --- a/src/handlers/state/get_password.rs +++ b/src/handlers/state/get_password.rs @@ -1,9 +1,7 @@ use sea_orm::prelude::*; use teloxide::{adaptors::Throttle, prelude::*}; -use crate::handlers::{ - markups::deletion_markup, utils::validate_field, MainDialogue, PackagedHandler, -}; +use crate::handlers::{markups::deletion_markup, utils::validate_field, MainDialogue}; /// Function to handle GetPassword state pub async fn get_password( @@ -11,7 +9,7 @@ pub async fn get_password( msg: Message, db: DatabaseConnection, dialogue: MainDialogue, - next: PackagedHandler, + next: super::PackagedHandler, ) -> crate::Result<()> { super::generic::generic( bot, diff --git a/src/handlers/state/handler.rs b/src/handlers/state/handler.rs new file mode 100644 index 0000000..6e61dbc --- /dev/null +++ b/src/handlers/state/handler.rs @@ -0,0 +1,45 @@ +use crate::handlers::MainDialogue; +use sea_orm::prelude::*; +use std::{future::Future, sync::Arc}; +use teloxide::{adaptors::Throttle, prelude::*}; +use tokio::sync::Mutex; + +#[allow(clippy::type_complexity)] +pub struct Handler { + pub handler: Box< + dyn FnOnce( + Throttle, + Message, + DatabaseConnection, + MainDialogue, + T, + ) -> crate::PinnedFuture<'static, crate::Result<()>> + + Send + + Sync, + >, + + pub previous: Option, +} + +pub type PackagedHandler = Arc>>>; + +impl Handler { + /// Convinience method to convert a simple async function and a previous message into PackagedHandler + #[inline] + pub fn new(f: H, previous: impl Into>) -> PackagedHandler + where + H: FnOnce(Throttle, Message, DatabaseConnection, MainDialogue, T) -> F + + Send + + Sync + + 'static, + F: Future> + Send + 'static, + { + let handler = Self { + handler: Box::new(move |bot, msg, db, dialogue, val| { + Box::pin(f(bot, msg, db, dialogue, val)) + }), + previous: previous.into(), + }; + Arc::new(Mutex::new(Some(handler))) + } +} diff --git a/src/handlers/state/mod.rs b/src/handlers/state/mod.rs index eb54e0c..81012e3 100644 --- a/src/handlers/state/mod.rs +++ b/src/handlers/state/mod.rs @@ -6,9 +6,11 @@ mod get_document; mod get_login; mod get_master_pass; mod get_password; +mod handler; pub use get_account_name::get_account_name; pub use get_document::get_document; pub use get_login::get_login; pub use get_master_pass::get_master_pass; pub use get_password::get_password; +pub use handler::{Handler, PackagedHandler}; diff --git a/src/handlers/utils.rs b/src/handlers/utils.rs index c21c3eb..d366ac9 100644 --- a/src/handlers/utils.rs +++ b/src/handlers/utils.rs @@ -1,26 +1,5 @@ -use crate::handlers::{Handler, MainDialogue, PackagedHandler}; -use sea_orm::prelude::*; -use std::{borrow::Borrow, future::Future, sync::Arc}; +use std::borrow::Borrow; use teloxide::{adaptors::Throttle, prelude::*}; -use tokio::sync::Mutex; - -/// Convinience method to convert a simple async function and a previous message into PackagedHandler -#[inline] -pub fn package_handler(f: H, previous: impl Into>) -> PackagedHandler -where - H: FnOnce(Throttle, Message, DatabaseConnection, MainDialogue, T) -> F - + Send - + Sync - + 'static, - F: Future> + Send + 'static, -{ - Arc::new(Mutex::new(Some(Handler { - handler: Box::new(move |bot, msg, db, dialogue, val| { - Box::pin(f(bot, msg, db, dialogue, val)) - }), - previous: previous.into(), - }))) -} /// Deletes the message ignoring the errors #[inline]