pub struct Dispatcher<R, Err, Key> { /* private fields */ }Expand description
The base for update dispatching.
§Update grouping
Dispatcher generally processes updates concurrently. However, by default,
updates from the same chat are processed sequentially. Learn more about
update grouping.
See also: “Dispatching or REPLs?”
Implementations§
Source§impl<R, Err> Dispatcher<R, Err, DefaultKey>
impl<R, Err> Dispatcher<R, Err, DefaultKey>
Sourcepub fn builder(
bot: R,
handler: UpdateHandler<Err>,
) -> DispatcherBuilder<R, Err, DefaultKey>where
Err: Debug,
pub fn builder(
bot: R,
handler: UpdateHandler<Err>,
) -> DispatcherBuilder<R, Err, DefaultKey>where
Err: Debug,
Constructs a new DispatcherBuilder with bot and handler.
Examples found in repository?
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
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}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}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}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}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§impl<R, Err, Key> Dispatcher<R, Err, Key>
impl<R, Err, Key> Dispatcher<R, Err, Key>
Sourcepub async fn dispatch(&mut self)
pub async fn dispatch(&mut self)
Starts your bot with the default parameters.
The default parameters are a long polling update listener and log all errors produced by this listener.
Each time a handler is invoked, Dispatcher adds the following
dependencies (in addition to those passed to
DispatcherBuilder::dependencies):
- Your bot passed to
Dispatcher::builder; - An update from Telegram;
crate::types::Me(can be used inHandlerExt::filter_command).
Examples found in repository?
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
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}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}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}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}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}Sourcepub async fn dispatch_with_listener<'a, UListener, Eh>(
&'a mut self,
update_listener: UListener,
update_listener_error_handler: Arc<Eh>,
)where
UListener: UpdateListener + Send + 'a,
Eh: ErrorHandler<UListener::Err> + Send + Sync + 'a,
UListener::Err: Debug,
pub async fn dispatch_with_listener<'a, UListener, Eh>(
&'a mut self,
update_listener: UListener,
update_listener_error_handler: Arc<Eh>,
)where
UListener: UpdateListener + Send + 'a,
Eh: ErrorHandler<UListener::Err> + Send + Sync + 'a,
UListener::Err: Debug,
Starts your bot with custom update_listener and
update_listener_error_handler.
This method adds the same dependencies as Dispatcher::dispatch.
Sourcepub async fn try_dispatch_with_listener<'a, UListener, Eh>(
&'a mut self,
update_listener: UListener,
update_listener_error_handler: Arc<Eh>,
) -> Result<(), R::Err>where
UListener: UpdateListener + Send + 'a,
Eh: ErrorHandler<UListener::Err> + Send + Sync + 'a,
UListener::Err: Debug,
pub async fn try_dispatch_with_listener<'a, UListener, Eh>(
&'a mut self,
update_listener: UListener,
update_listener_error_handler: Arc<Eh>,
) -> Result<(), R::Err>where
UListener: UpdateListener + Send + 'a,
Eh: ErrorHandler<UListener::Err> + Send + Sync + 'a,
UListener::Err: Debug,
Same as dispatch_with_listener but returns a Err(_) instead of
panicking when the initial telegram api call (get_me) fails.
Starts your bot with custom update_listener and
update_listener_error_handler.
This method adds the same dependencies as Dispatcher::dispatch.
Sourcepub fn shutdown_token(&self) -> ShutdownToken
pub fn shutdown_token(&self) -> ShutdownToken
Returns a shutdown token, which can later be used to
ShutdownToken::shutdown.
Auto Trait Implementations§
impl<R, Err, Key> Freeze for Dispatcher<R, Err, Key>where
R: Freeze,
impl<R, Err, Key> !RefUnwindSafe for Dispatcher<R, Err, Key>
impl<R, Err, Key> Send for Dispatcher<R, Err, Key>
impl<R, Err, Key> Sync for Dispatcher<R, Err, Key>
impl<R, Err, Key> Unpin for Dispatcher<R, Err, Key>
impl<R, Err, Key> !UnwindSafe for Dispatcher<R, Err, Key>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Erasable for T
impl<T> Erasable for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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