mirror of
https://github.com/teloxide/teloxide.git
synced 2025-03-21 14:29:01 +01:00
Initial commit.
1. Added `dptree` dependency. 2. Added `dispatching2` module. 2. Added `Dispatcher` and `Handlers` types, which is similar to `dispatching::Dispatcher` type.
This commit is contained in:
parent
2b55ee8482
commit
887b24d27f
5 changed files with 108 additions and 0 deletions
|
@ -75,6 +75,8 @@ teloxide-macros = { version = "0.4", optional = true }
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
serde = { version = "1.0", features = ["derive"] }
|
serde = { version = "1.0", features = ["derive"] }
|
||||||
|
|
||||||
|
dptree = { git = "https://github.com/p0lunin/dptree", branch = "kiss3" }
|
||||||
|
|
||||||
tokio = { version = "1.8", features = ["fs"] }
|
tokio = { version = "1.8", features = ["fs"] }
|
||||||
tokio-util = "0.6"
|
tokio-util = "0.6"
|
||||||
tokio-stream = "0.1"
|
tokio-stream = "0.1"
|
||||||
|
|
44
src/dispatching2/dispatcher.rs
Normal file
44
src/dispatching2/dispatcher.rs
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
use crate::{
|
||||||
|
dispatching2::handlers::{Handlers, Replaced, UpdateHandler},
|
||||||
|
types,
|
||||||
|
types::Update,
|
||||||
|
};
|
||||||
|
use dptree::{di::DependencySupplier, Replace};
|
||||||
|
|
||||||
|
pub struct Dispatcher<C, Err>
|
||||||
|
where
|
||||||
|
C: Replace<Update, types::Message>,
|
||||||
|
{
|
||||||
|
handlers: Handlers<C, Err>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<C, IR, Err> Dispatcher<C, Err>
|
||||||
|
where
|
||||||
|
C: DependencySupplier<Update>
|
||||||
|
+ Send
|
||||||
|
+ Sync
|
||||||
|
+ 'static
|
||||||
|
+ Replace<Update, types::Message, Out = IR>,
|
||||||
|
IR: Send + Sync + 'static + Replace<types::Message, Update, Out = C>,
|
||||||
|
Err: Send + Sync + 'static,
|
||||||
|
{
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Dispatcher { handlers: Handlers::new() }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn message_handler(
|
||||||
|
mut self,
|
||||||
|
handler: UpdateHandler<Replaced<C, types::Message>, Err>,
|
||||||
|
) -> Self {
|
||||||
|
self.handlers.message_handler(handler);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn edited_message_handler(
|
||||||
|
mut self,
|
||||||
|
handler: UpdateHandler<Replaced<C, types::Message>, Err>,
|
||||||
|
) -> Self {
|
||||||
|
self.handlers.edited_message_handler(handler);
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
57
src/dispatching2/handlers.rs
Normal file
57
src/dispatching2/handlers.rs
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
use crate::{
|
||||||
|
types,
|
||||||
|
types::{Update, UpdateKind},
|
||||||
|
};
|
||||||
|
use dptree::{di::DependencySupplier, Handler, Replace};
|
||||||
|
|
||||||
|
pub type Replaced<C, T2> = <C as Replace<Update, T2>>::Out;
|
||||||
|
|
||||||
|
pub struct Handlers<C, Err>
|
||||||
|
where
|
||||||
|
C: Replace<Update, types::Message>,
|
||||||
|
{
|
||||||
|
message_handler: UpdateHandler<C, Err, Replaced<C, types::Message>>,
|
||||||
|
edited_message_handler: UpdateHandler<C, Err, Replaced<C, types::Message>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! new_handler {
|
||||||
|
($kind:ident) => {
|
||||||
|
dptree::parser(|upd: &Update| match &upd.kind {
|
||||||
|
UpdateKind::$kind(u) => Some(u.clone()),
|
||||||
|
_ => None,
|
||||||
|
})
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<C, IR, Err> Handlers<C, Err>
|
||||||
|
where
|
||||||
|
C: DependencySupplier<Update>
|
||||||
|
+ Send
|
||||||
|
+ Sync
|
||||||
|
+ 'static
|
||||||
|
+ Replace<Update, types::Message, Out = IR>,
|
||||||
|
IR: Send + Sync + 'static + Replace<types::Message, Update, Out = C>,
|
||||||
|
Err: Send + Sync + 'static,
|
||||||
|
{
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Handlers {
|
||||||
|
message_handler: new_handler!(Message),
|
||||||
|
edited_message_handler: new_handler!(EditedMessage),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn message_handler(&mut self, handler: UpdateHandler<Replaced<C, types::Message>, Err>) {
|
||||||
|
self.message_handler = self.message_handler.clone().branch(handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn edited_message_handler(
|
||||||
|
&mut self,
|
||||||
|
handler: UpdateHandler<Replaced<C, types::Message>, Err>,
|
||||||
|
) {
|
||||||
|
self.edited_message_handler = self.edited_message_handler.clone().branch(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: it is allowed to return message as answer on telegram request in
|
||||||
|
// webhooks, so we can allow this too. See more there: https://core.telegram.org/bots/api#making-requests-when-getting-updates
|
||||||
|
pub type UpdateHandler<C, Err, IR = C> = Handler<'static, C, Result<(), Err>, IR>;
|
4
src/dispatching2/mod.rs
Normal file
4
src/dispatching2/mod.rs
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
mod dispatcher;
|
||||||
|
mod handlers;
|
||||||
|
|
||||||
|
pub use dispatcher::Dispatcher;
|
|
@ -68,6 +68,7 @@ pub use dispatching::repls::{
|
||||||
mod logging;
|
mod logging;
|
||||||
|
|
||||||
pub mod dispatching;
|
pub mod dispatching;
|
||||||
|
pub mod dispatching2;
|
||||||
pub mod error_handlers;
|
pub mod error_handlers;
|
||||||
pub mod prelude;
|
pub mod prelude;
|
||||||
pub mod utils;
|
pub mod utils;
|
||||||
|
|
Loading…
Add table
Reference in a new issue