middlewares_fallible/
middlewares_fallible.rs

1use teloxide::prelude::*;
2
3type HandlerResult = Result<(), teloxide::RequestError>;
4
5#[tokio::main]
6async fn main() {
7    pretty_env_logger::init();
8    log::info!("Starting middlewares_fallible 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. If the endpoint failed, print an error message and stop
18        // execution; if not, continue.
19        .filter(|result: HandlerResult, msg: Message| {
20            println!("In-between (message #{}).", msg.id);
21            match result {
22                Ok(()) => true,
23                Err(err) => {
24                    eprintln!("Our endpoint failed: {err}");
25                    false
26                }
27            }
28        })
29        // Executes only if the endpoint succeeded.
30        .endpoint(|msg: Message| async move {
31            println!("After (message #{}).", msg.id);
32            HandlerResult::Ok(())
33        });
34
35    Dispatcher::builder(bot, handler).enable_ctrlc_handler().build().dispatch().await;
36}
37
38async fn my_endpoint(bot: Bot, msg: Message) -> HandlerResult {
39    bot.send_message(msg.chat.id, "Inside the endpoint.").await?;
40    Ok(())
41}