Struct DispatcherBuilder

Source
pub struct DispatcherBuilder<R, Err, Key> { /* private fields */ }
Expand description

The builder for Dispatcher.

See also: “Dispatching or REPLs?”

Implementations§

Source§

impl<R, Err, Key> DispatcherBuilder<R, Err, Key>
where R: Clone + Requester + Send + Sync + 'static, Err: Debug + Send + Sync + 'static,

Source

pub fn default_handler<H, Fut>(self, handler: H) -> Self
where H: Fn(Arc<Update>) -> Fut + Send + Sync + 'static, Fut: Future<Output = ()> + Send + 'static,

Specifies a handler that will be called for an unhandled update.

By default, it is a mere log::warn.

Examples found in repository?
examples/dispatching_features.rs (lines 97-99)
12async fn main() {
13    pretty_env_logger::init();
14    log::info!("Starting dispatching features bot...");
15
16    let bot = Bot::from_env();
17
18    let parameters = ConfigParameters {
19        bot_maintainer: UserId(0), // Paste your ID to run this bot.
20        maintainer_username: None,
21    };
22
23    let handler = Update::filter_message()
24        // You can use branching to define multiple ways in which an update will be handled. If the
25        // first branch fails, an update will be passed to the second branch, and so on.
26        .branch(
27            dptree::entry()
28                // Filter commands: the next handlers will receive a parsed `SimpleCommand`.
29                .filter_command::<SimpleCommand>()
30                // If a command parsing fails, this handler will not be executed.
31                .endpoint(simple_commands_handler),
32        )
33        .branch(
34            // Filter a maintainer by a user ID.
35            dptree::filter(|cfg: ConfigParameters, msg: Message| {
36                msg.from.map(|user| user.id == cfg.bot_maintainer).unwrap_or_default()
37            })
38            .filter_command::<MaintainerCommands>()
39            .endpoint(|msg: Message, bot: Bot, cmd: MaintainerCommands| async move {
40                match cmd {
41                    MaintainerCommands::Rand { from, to } => {
42                        let mut rng = rand::rngs::OsRng;
43                        let value: u64 = rng.gen_range(from..=to);
44
45                        bot.send_message(msg.chat.id, value.to_string()).await?;
46                        Ok(())
47                    }
48                }
49            }),
50        )
51        .branch(
52            // Filtering allow you to filter updates by some condition.
53            dptree::filter(|msg: Message| msg.chat.is_group() || msg.chat.is_supergroup())
54                .branch(
55                    // Filtering by mention allows to filter only `/repeat@my_bot` commands.
56                    // Use if you want to make sure that users refer specifically to your bot.
57                    // Same as filter_command, the next handlers will receive a parsed
58                    // `GroupCommand`.
59                    dptree::entry().filter_mention_command::<GroupCommand>().endpoint(
60                        |bot: Bot, msg: Message, cmd: GroupCommand| async move {
61                            match cmd {
62                                GroupCommand::Repeat { text } => {
63                                    bot.send_message(msg.chat.id, format!("You said: {text}"))
64                                        .await?;
65                                    Ok(())
66                                }
67                            }
68                        },
69                    ),
70                )
71                .branch(
72                    // An endpoint is the last update handler.
73                    dptree::endpoint(|msg: Message, bot: Bot| async move {
74                        log::info!("Received a message from a group chat.");
75                        bot.send_message(msg.chat.id, "This is a group chat.").await?;
76                        respond(())
77                    }),
78                ),
79        )
80        .branch(
81            // There are some extension filtering functions on `Message`. The following filter will
82            // filter only messages with dices.
83            Message::filter_dice().endpoint(|bot: Bot, msg: Message, dice: Dice| async move {
84                bot.send_message(msg.chat.id, format!("Dice value: {}", dice.value))
85                    .reply_to(msg)
86                    .await?;
87                Ok(())
88            }),
89        );
90
91    Dispatcher::builder(bot, handler)
92        // Here you specify initial dependencies that all handlers will receive; they can be
93        // database connections, configurations, and other auxiliary arguments. It is similar to
94        // `actix_web::Extensions`.
95        .dependencies(dptree::deps![parameters])
96        // If no handler succeeded to handle an update, this closure will be called.
97        .default_handler(|upd| async move {
98            log::warn!("Unhandled update: {upd:?}");
99        })
100        // If the dispatcher fails for some reason, execute this handler.
101        .error_handler(LoggingErrorHandler::with_custom_text(
102            "An error has occurred in the dispatcher",
103        ))
104        .enable_ctrlc_handler()
105        .build()
106        .dispatch()
107        .await;
108}
Source

pub fn error_handler( self, handler: Arc<dyn ErrorHandler<Err> + Send + Sync>, ) -> Self

Specifies a handler that will be called on a handler error.

By default, it is LoggingErrorHandler.

Examples found in repository?
examples/dispatching_features.rs (lines 101-103)
12async fn main() {
13    pretty_env_logger::init();
14    log::info!("Starting dispatching features bot...");
15
16    let bot = Bot::from_env();
17
18    let parameters = ConfigParameters {
19        bot_maintainer: UserId(0), // Paste your ID to run this bot.
20        maintainer_username: None,
21    };
22
23    let handler = Update::filter_message()
24        // You can use branching to define multiple ways in which an update will be handled. If the
25        // first branch fails, an update will be passed to the second branch, and so on.
26        .branch(
27            dptree::entry()
28                // Filter commands: the next handlers will receive a parsed `SimpleCommand`.
29                .filter_command::<SimpleCommand>()
30                // If a command parsing fails, this handler will not be executed.
31                .endpoint(simple_commands_handler),
32        )
33        .branch(
34            // Filter a maintainer by a user ID.
35            dptree::filter(|cfg: ConfigParameters, msg: Message| {
36                msg.from.map(|user| user.id == cfg.bot_maintainer).unwrap_or_default()
37            })
38            .filter_command::<MaintainerCommands>()
39            .endpoint(|msg: Message, bot: Bot, cmd: MaintainerCommands| async move {
40                match cmd {
41                    MaintainerCommands::Rand { from, to } => {
42                        let mut rng = rand::rngs::OsRng;
43                        let value: u64 = rng.gen_range(from..=to);
44
45                        bot.send_message(msg.chat.id, value.to_string()).await?;
46                        Ok(())
47                    }
48                }
49            }),
50        )
51        .branch(
52            // Filtering allow you to filter updates by some condition.
53            dptree::filter(|msg: Message| msg.chat.is_group() || msg.chat.is_supergroup())
54                .branch(
55                    // Filtering by mention allows to filter only `/repeat@my_bot` commands.
56                    // Use if you want to make sure that users refer specifically to your bot.
57                    // Same as filter_command, the next handlers will receive a parsed
58                    // `GroupCommand`.
59                    dptree::entry().filter_mention_command::<GroupCommand>().endpoint(
60                        |bot: Bot, msg: Message, cmd: GroupCommand| async move {
61                            match cmd {
62                                GroupCommand::Repeat { text } => {
63                                    bot.send_message(msg.chat.id, format!("You said: {text}"))
64                                        .await?;
65                                    Ok(())
66                                }
67                            }
68                        },
69                    ),
70                )
71                .branch(
72                    // An endpoint is the last update handler.
73                    dptree::endpoint(|msg: Message, bot: Bot| async move {
74                        log::info!("Received a message from a group chat.");
75                        bot.send_message(msg.chat.id, "This is a group chat.").await?;
76                        respond(())
77                    }),
78                ),
79        )
80        .branch(
81            // There are some extension filtering functions on `Message`. The following filter will
82            // filter only messages with dices.
83            Message::filter_dice().endpoint(|bot: Bot, msg: Message, dice: Dice| async move {
84                bot.send_message(msg.chat.id, format!("Dice value: {}", dice.value))
85                    .reply_to(msg)
86                    .await?;
87                Ok(())
88            }),
89        );
90
91    Dispatcher::builder(bot, handler)
92        // Here you specify initial dependencies that all handlers will receive; they can be
93        // database connections, configurations, and other auxiliary arguments. It is similar to
94        // `actix_web::Extensions`.
95        .dependencies(dptree::deps![parameters])
96        // If no handler succeeded to handle an update, this closure will be called.
97        .default_handler(|upd| async move {
98            log::warn!("Unhandled update: {upd:?}");
99        })
100        // If the dispatcher fails for some reason, execute this handler.
101        .error_handler(LoggingErrorHandler::with_custom_text(
102            "An error has occurred in the dispatcher",
103        ))
104        .enable_ctrlc_handler()
105        .build()
106        .dispatch()
107        .await;
108}
Source

pub fn dependencies(self, dependencies: DependencyMap) -> Self

Specifies dependencies that can be used inside of handlers.

By default, there is no dependencies.

Examples found in repository?
examples/purchase.rs (line 55)
48async fn main() {
49    pretty_env_logger::init();
50    log::info!("Starting purchase bot...");
51
52    let bot = Bot::from_env();
53
54    Dispatcher::builder(bot, schema())
55        .dependencies(dptree::deps![InMemStorage::<State>::new()])
56        .enable_ctrlc_handler()
57        .build()
58        .dispatch()
59        .await;
60}
More examples
Hide additional examples
examples/deep_linking.rs (line 58)
40async fn main() {
41    pretty_env_logger::init();
42    log::info!("Starting deep linking bot...");
43
44    let bot = Bot::from_env();
45
46    let handler = dialogue::enter::<Update, InMemStorage<State>, State, _>()
47        .branch(
48            Update::filter_message()
49                .filter_command::<StartCommand>()
50                .branch(case![StartCommand::Start(start)].endpoint(start)),
51        )
52        .branch(
53            Update::filter_message()
54                .branch(case![State::WriteToSomeone { id }].endpoint(send_message)),
55        );
56
57    Dispatcher::builder(bot, handler)
58        .dependencies(deps![InMemStorage::<State>::new()])
59        .enable_ctrlc_handler()
60        .build()
61        .dispatch()
62        .await;
63}
examples/dialogue.rs (line 53)
36async fn main() {
37    pretty_env_logger::init();
38    log::info!("Starting dialogue bot...");
39
40    let bot = Bot::from_env();
41
42    Dispatcher::builder(
43        bot,
44        Update::filter_message()
45            .enter_dialogue::<Message, InMemStorage<State>, State>()
46            .branch(dptree::case![State::Start].endpoint(start))
47            .branch(dptree::case![State::ReceiveFullName].endpoint(receive_full_name))
48            .branch(dptree::case![State::ReceiveAge { full_name }].endpoint(receive_age))
49            .branch(
50                dptree::case![State::ReceiveLocation { full_name, age }].endpoint(receive_location),
51            ),
52    )
53    .dependencies(dptree::deps![InMemStorage::<State>::new()])
54    .enable_ctrlc_handler()
55    .build()
56    .dispatch()
57    .await;
58}
examples/shared_state.rs (line 29)
11async fn main() {
12    pretty_env_logger::init();
13    log::info!("Starting shared state bot...");
14
15    let bot = Bot::from_env();
16    let messages_total = Arc::new(AtomicU64::new(0));
17
18    let handler = Update::filter_message().endpoint(
19        |bot: Bot, messages_total: Arc<AtomicU64>, msg: Message| async move {
20            let previous = messages_total.fetch_add(1, Ordering::Relaxed);
21            bot.send_message(msg.chat.id, format!("I received {previous} messages in total."))
22                .await?;
23            respond(())
24        },
25    );
26
27    Dispatcher::builder(bot, handler)
28        // Pass the shared state to the handler as a dependency.
29        .dependencies(dptree::deps![messages_total])
30        .enable_ctrlc_handler()
31        .build()
32        .dispatch()
33        .await;
34}
examples/db_remember.rs (line 57)
35async fn main() {
36    pretty_env_logger::init();
37    log::info!("Starting DB remember bot...");
38
39    let bot = Bot::from_env();
40
41    let storage: MyStorage = if std::env::var("DB_REMEMBER_REDIS").is_ok() {
42        RedisStorage::open("redis://127.0.0.1:6379", Bincode).await.unwrap().erase()
43    } else {
44        SqliteStorage::open("db.sqlite", Json).await.unwrap().erase()
45    };
46
47    let handler = Update::filter_message()
48        .enter_dialogue::<Message, ErasedStorage<State>, State>()
49        .branch(dptree::case![State::Start].endpoint(start))
50        .branch(
51            dptree::case![State::GotNumber(n)]
52                .branch(dptree::entry().filter_command::<Command>().endpoint(got_number))
53                .branch(dptree::endpoint(invalid_command)),
54        );
55
56    Dispatcher::builder(bot, handler)
57        .dependencies(dptree::deps![storage])
58        .enable_ctrlc_handler()
59        .build()
60        .dispatch()
61        .await;
62}
examples/dispatching_features.rs (line 95)
12async fn main() {
13    pretty_env_logger::init();
14    log::info!("Starting dispatching features bot...");
15
16    let bot = Bot::from_env();
17
18    let parameters = ConfigParameters {
19        bot_maintainer: UserId(0), // Paste your ID to run this bot.
20        maintainer_username: None,
21    };
22
23    let handler = Update::filter_message()
24        // You can use branching to define multiple ways in which an update will be handled. If the
25        // first branch fails, an update will be passed to the second branch, and so on.
26        .branch(
27            dptree::entry()
28                // Filter commands: the next handlers will receive a parsed `SimpleCommand`.
29                .filter_command::<SimpleCommand>()
30                // If a command parsing fails, this handler will not be executed.
31                .endpoint(simple_commands_handler),
32        )
33        .branch(
34            // Filter a maintainer by a user ID.
35            dptree::filter(|cfg: ConfigParameters, msg: Message| {
36                msg.from.map(|user| user.id == cfg.bot_maintainer).unwrap_or_default()
37            })
38            .filter_command::<MaintainerCommands>()
39            .endpoint(|msg: Message, bot: Bot, cmd: MaintainerCommands| async move {
40                match cmd {
41                    MaintainerCommands::Rand { from, to } => {
42                        let mut rng = rand::rngs::OsRng;
43                        let value: u64 = rng.gen_range(from..=to);
44
45                        bot.send_message(msg.chat.id, value.to_string()).await?;
46                        Ok(())
47                    }
48                }
49            }),
50        )
51        .branch(
52            // Filtering allow you to filter updates by some condition.
53            dptree::filter(|msg: Message| msg.chat.is_group() || msg.chat.is_supergroup())
54                .branch(
55                    // Filtering by mention allows to filter only `/repeat@my_bot` commands.
56                    // Use if you want to make sure that users refer specifically to your bot.
57                    // Same as filter_command, the next handlers will receive a parsed
58                    // `GroupCommand`.
59                    dptree::entry().filter_mention_command::<GroupCommand>().endpoint(
60                        |bot: Bot, msg: Message, cmd: GroupCommand| async move {
61                            match cmd {
62                                GroupCommand::Repeat { text } => {
63                                    bot.send_message(msg.chat.id, format!("You said: {text}"))
64                                        .await?;
65                                    Ok(())
66                                }
67                            }
68                        },
69                    ),
70                )
71                .branch(
72                    // An endpoint is the last update handler.
73                    dptree::endpoint(|msg: Message, bot: Bot| async move {
74                        log::info!("Received a message from a group chat.");
75                        bot.send_message(msg.chat.id, "This is a group chat.").await?;
76                        respond(())
77                    }),
78                ),
79        )
80        .branch(
81            // There are some extension filtering functions on `Message`. The following filter will
82            // filter only messages with dices.
83            Message::filter_dice().endpoint(|bot: Bot, msg: Message, dice: Dice| async move {
84                bot.send_message(msg.chat.id, format!("Dice value: {}", dice.value))
85                    .reply_to(msg)
86                    .await?;
87                Ok(())
88            }),
89        );
90
91    Dispatcher::builder(bot, handler)
92        // Here you specify initial dependencies that all handlers will receive; they can be
93        // database connections, configurations, and other auxiliary arguments. It is similar to
94        // `actix_web::Extensions`.
95        .dependencies(dptree::deps![parameters])
96        // If no handler succeeded to handle an update, this closure will be called.
97        .default_handler(|upd| async move {
98            log::warn!("Unhandled update: {upd:?}");
99        })
100        // If the dispatcher fails for some reason, execute this handler.
101        .error_handler(LoggingErrorHandler::with_custom_text(
102            "An error has occurred in the dispatcher",
103        ))
104        .enable_ctrlc_handler()
105        .build()
106        .dispatch()
107        .await;
108}
Source

pub fn enable_ctrlc_handler(self) -> Self

Available on crate feature ctrlc_handler only.

Enables the ^C handler that shutdowns dispatching.

Examples found in repository?
examples/purchase.rs (line 56)
48async fn main() {
49    pretty_env_logger::init();
50    log::info!("Starting purchase bot...");
51
52    let bot = Bot::from_env();
53
54    Dispatcher::builder(bot, schema())
55        .dependencies(dptree::deps![InMemStorage::<State>::new()])
56        .enable_ctrlc_handler()
57        .build()
58        .dispatch()
59        .await;
60}
More examples
Hide additional examples
examples/buttons.rs (line 35)
24async fn main() -> Result<(), Box<dyn Error>> {
25    pretty_env_logger::init();
26    log::info!("Starting buttons bot...");
27
28    let bot = Bot::from_env();
29
30    let handler = dptree::entry()
31        .branch(Update::filter_message().endpoint(message_handler))
32        .branch(Update::filter_callback_query().endpoint(callback_handler))
33        .branch(Update::filter_inline_query().endpoint(inline_query_handler));
34
35    Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
36    Ok(())
37}
examples/deep_linking.rs (line 59)
40async fn main() {
41    pretty_env_logger::init();
42    log::info!("Starting deep linking bot...");
43
44    let bot = Bot::from_env();
45
46    let handler = dialogue::enter::<Update, InMemStorage<State>, State, _>()
47        .branch(
48            Update::filter_message()
49                .filter_command::<StartCommand>()
50                .branch(case![StartCommand::Start(start)].endpoint(start)),
51        )
52        .branch(
53            Update::filter_message()
54                .branch(case![State::WriteToSomeone { id }].endpoint(send_message)),
55        );
56
57    Dispatcher::builder(bot, handler)
58        .dependencies(deps![InMemStorage::<State>::new()])
59        .enable_ctrlc_handler()
60        .build()
61        .dispatch()
62        .await;
63}
examples/dialogue.rs (line 54)
36async fn main() {
37    pretty_env_logger::init();
38    log::info!("Starting dialogue bot...");
39
40    let bot = Bot::from_env();
41
42    Dispatcher::builder(
43        bot,
44        Update::filter_message()
45            .enter_dialogue::<Message, InMemStorage<State>, State>()
46            .branch(dptree::case![State::Start].endpoint(start))
47            .branch(dptree::case![State::ReceiveFullName].endpoint(receive_full_name))
48            .branch(dptree::case![State::ReceiveAge { full_name }].endpoint(receive_age))
49            .branch(
50                dptree::case![State::ReceiveLocation { full_name, age }].endpoint(receive_location),
51            ),
52    )
53    .dependencies(dptree::deps![InMemStorage::<State>::new()])
54    .enable_ctrlc_handler()
55    .build()
56    .dispatch()
57    .await;
58}
examples/shared_state.rs (line 30)
11async fn main() {
12    pretty_env_logger::init();
13    log::info!("Starting shared state bot...");
14
15    let bot = Bot::from_env();
16    let messages_total = Arc::new(AtomicU64::new(0));
17
18    let handler = Update::filter_message().endpoint(
19        |bot: Bot, messages_total: Arc<AtomicU64>, msg: Message| async move {
20            let previous = messages_total.fetch_add(1, Ordering::Relaxed);
21            bot.send_message(msg.chat.id, format!("I received {previous} messages in total."))
22                .await?;
23            respond(())
24        },
25    );
26
27    Dispatcher::builder(bot, handler)
28        // Pass the shared state to the handler as a dependency.
29        .dependencies(dptree::deps![messages_total])
30        .enable_ctrlc_handler()
31        .build()
32        .dispatch()
33        .await;
34}
examples/middlewares.rs (line 28)
6async fn main() {
7    pretty_env_logger::init();
8    log::info!("Starting middlewares bot...");
9
10    let bot = Bot::from_env();
11
12    let handler = Update::filter_message()
13        // Executes before the endpoint.
14        .inspect(|msg: Message| println!("Before (message #{}).", msg.id))
15        // Our "endpoint".
16        .map_async(my_endpoint)
17        // Executes after the endpoint (even if it fails).
18        .inspect(|msg: Message| {
19            println!("After (message #{}).", msg.id);
20        })
21        // Retrieve the result of the endpoint and pass it to the dispatcher.
22        .endpoint(|result: HandlerResult| async move {
23            // Alternatively, we could also pattern-match on this value for more
24            // fine-grained behaviour.
25            result
26        });
27
28    Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
29}
Source

pub fn worker_queue_size(self, size: usize) -> Self

Specifies size of the queue for workers.

By default it’s 64.

Source

pub fn stack_size(self, _size: usize) -> Self

👎Deprecated since 0.15.0: This method is a no-op; you can just remove it.

Specifies the stack size available to the dispatcher.

By default, it’s 8 * 1024 * 1024 bytes (8 MiB).

Source

pub fn distribution_function<K>( self, f: fn(&Update) -> Option<K>, ) -> DispatcherBuilder<R, Err, K>
where K: Hash + Eq,

Specifies the distribution function that decides how updates are grouped before execution.

§Update grouping

When Dispatcher receives updates, it runs dispatching tree (handlers) concurrently. This means that multiple updates can be processed at the same time.

However, this is not always convenient. For example, if you have global state, then you may want to process some updates sequentially, to prevent state inconsistencies.

This is why teloxide allows grouping updates. Updates for which the distribution function f returns the same “distribution key” K will be run in sequence (while still being processed concurrently with the updates with different distribution keys).

Updates for which f returns None will always be processed in parallel.

§Default distribution function

By default the distribution function is equivalent to |upd| upd.chat().map(|chat| chat.id), so updates from the same chat will be processed sequentially.

This pair nicely with dialogue system, which has state attached to chats.

§Examples

Grouping updates by user who caused this update to happen:

use teloxide::{dispatching::Dispatcher, dptree, Bot};

let bot = Bot::new("TOKEN");
let handler = dptree::entry() /* ... */;
let dp = Dispatcher::builder(bot, handler)
    .distribution_function(|upd| upd.from().map(|user| user.id))
    .build();

Not grouping updates at all, always processing updates concurrently:

use teloxide::{dispatching::Dispatcher, dptree, Bot};

let bot = Bot::new("TOKEN");
let handler = dptree::entry() /* ... */;
let dp = Dispatcher::builder(bot, handler).distribution_function(|_| None::<()>).build();
Source

pub fn build(self) -> Dispatcher<R, Err, Key>

Constructs Dispatcher.

§Panics

This function will panic at run-time if dptree fails to type-check the provided handler. An appropriate error message will be emitted.

Examples found in repository?
examples/purchase.rs (line 57)
48async fn main() {
49    pretty_env_logger::init();
50    log::info!("Starting purchase bot...");
51
52    let bot = Bot::from_env();
53
54    Dispatcher::builder(bot, schema())
55        .dependencies(dptree::deps![InMemStorage::<State>::new()])
56        .enable_ctrlc_handler()
57        .build()
58        .dispatch()
59        .await;
60}
More examples
Hide additional examples
examples/buttons.rs (line 35)
24async fn main() -> Result<(), Box<dyn Error>> {
25    pretty_env_logger::init();
26    log::info!("Starting buttons bot...");
27
28    let bot = Bot::from_env();
29
30    let handler = dptree::entry()
31        .branch(Update::filter_message().endpoint(message_handler))
32        .branch(Update::filter_callback_query().endpoint(callback_handler))
33        .branch(Update::filter_inline_query().endpoint(inline_query_handler));
34
35    Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
36    Ok(())
37}
examples/deep_linking.rs (line 60)
40async fn main() {
41    pretty_env_logger::init();
42    log::info!("Starting deep linking bot...");
43
44    let bot = Bot::from_env();
45
46    let handler = dialogue::enter::<Update, InMemStorage<State>, State, _>()
47        .branch(
48            Update::filter_message()
49                .filter_command::<StartCommand>()
50                .branch(case![StartCommand::Start(start)].endpoint(start)),
51        )
52        .branch(
53            Update::filter_message()
54                .branch(case![State::WriteToSomeone { id }].endpoint(send_message)),
55        );
56
57    Dispatcher::builder(bot, handler)
58        .dependencies(deps![InMemStorage::<State>::new()])
59        .enable_ctrlc_handler()
60        .build()
61        .dispatch()
62        .await;
63}
examples/dialogue.rs (line 55)
36async fn main() {
37    pretty_env_logger::init();
38    log::info!("Starting dialogue bot...");
39
40    let bot = Bot::from_env();
41
42    Dispatcher::builder(
43        bot,
44        Update::filter_message()
45            .enter_dialogue::<Message, InMemStorage<State>, State>()
46            .branch(dptree::case![State::Start].endpoint(start))
47            .branch(dptree::case![State::ReceiveFullName].endpoint(receive_full_name))
48            .branch(dptree::case![State::ReceiveAge { full_name }].endpoint(receive_age))
49            .branch(
50                dptree::case![State::ReceiveLocation { full_name, age }].endpoint(receive_location),
51            ),
52    )
53    .dependencies(dptree::deps![InMemStorage::<State>::new()])
54    .enable_ctrlc_handler()
55    .build()
56    .dispatch()
57    .await;
58}
examples/shared_state.rs (line 31)
11async fn main() {
12    pretty_env_logger::init();
13    log::info!("Starting shared state bot...");
14
15    let bot = Bot::from_env();
16    let messages_total = Arc::new(AtomicU64::new(0));
17
18    let handler = Update::filter_message().endpoint(
19        |bot: Bot, messages_total: Arc<AtomicU64>, msg: Message| async move {
20            let previous = messages_total.fetch_add(1, Ordering::Relaxed);
21            bot.send_message(msg.chat.id, format!("I received {previous} messages in total."))
22                .await?;
23            respond(())
24        },
25    );
26
27    Dispatcher::builder(bot, handler)
28        // Pass the shared state to the handler as a dependency.
29        .dependencies(dptree::deps![messages_total])
30        .enable_ctrlc_handler()
31        .build()
32        .dispatch()
33        .await;
34}
examples/middlewares.rs (line 28)
6async fn main() {
7    pretty_env_logger::init();
8    log::info!("Starting middlewares bot...");
9
10    let bot = Bot::from_env();
11
12    let handler = Update::filter_message()
13        // Executes before the endpoint.
14        .inspect(|msg: Message| println!("Before (message #{}).", msg.id))
15        // Our "endpoint".
16        .map_async(my_endpoint)
17        // Executes after the endpoint (even if it fails).
18        .inspect(|msg: Message| {
19            println!("After (message #{}).", msg.id);
20        })
21        // Retrieve the result of the endpoint and pass it to the dispatcher.
22        .endpoint(|result: HandlerResult| async move {
23            // Alternatively, we could also pattern-match on this value for more
24            // fine-grained behaviour.
25            result
26        });
27
28    Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
29}

Auto Trait Implementations§

§

impl<R, Err, Key> Freeze for DispatcherBuilder<R, Err, Key>
where R: Freeze,

§

impl<R, Err, Key> !RefUnwindSafe for DispatcherBuilder<R, Err, Key>

§

impl<R, Err, Key> Send for DispatcherBuilder<R, Err, Key>
where R: Send,

§

impl<R, Err, Key> Sync for DispatcherBuilder<R, Err, Key>
where R: Sync,

§

impl<R, Err, Key> Unpin for DispatcherBuilder<R, Err, Key>
where R: Unpin,

§

impl<R, Err, Key> !UnwindSafe for DispatcherBuilder<R, Err, Key>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Erasable for T

Source§

const ACK_1_1_0: bool = true

Whether this implementor has acknowledged the 1.1.0 update to unerase’s documented implementation requirements. Read more
Source§

unsafe fn unerase(this: NonNull<Erased>) -> NonNull<T>

Unerase this erased pointer. Read more
Source§

fn erase(this: NonNull<Self>) -> NonNull<Erased>

Turn this erasable pointer into an erased pointer. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ErasedDestructor for T
where T: 'static,