telegram_bot2/
from_update.rs

1use crate::models::{ChatId, ChatMember, Message, Update};
2use crate::{Bot, BotState};
3
4/// Allow a parameter to be parsed from an update and the bot state.
5/// Any type implementing this trait can be used as parameter in a handler
6pub trait FromUpdate<'r, T: Sync>
7where
8    Self: Sized,
9{
10    /// Instantiate `Self` from an incoming update
11    fn from_update(bot: &'r Bot, update: &'r Update, state: Option<&'r BotState<T>>) -> Option<Self>;
12}
13
14impl<'r, T: Sync> FromUpdate<'r, T> for &'r Bot {
15    fn from_update(bot: &'r Bot, _: &Update, _: Option<&BotState<T>>) -> Option<Self> {
16        Some(bot)
17    }
18}
19
20impl<'r, T: Sync> FromUpdate<'r, T> for &'r Update {
21    fn from_update(_: &Bot, update: &'r Update, _: Option<&BotState<T>>) -> Option<Self> {
22        Some(update)
23    }
24}
25
26impl<'r, T: Sync> FromUpdate<'r, T> for &'r BotState<T> {
27    fn from_update(_: &Bot, _: &Update, state: Option<&'r BotState<T>>) -> Option<Self> {
28        state
29    }
30}
31
32impl<'r, T: Sync> FromUpdate<'r, T> for &'r Message {
33    fn from_update(_: &Bot, u: &'r Update, _: Option<&BotState<T>>) -> Option<Self> {
34        match u {
35            Update::NewMessage(_, m) => Some(m),
36            Update::EditedMessage(_, m) => Some(m),
37            Update::NewChannelPost(_, m) => Some(m),
38            Update::EditedChannelPost(_, m) => Some(m),
39            Update::CallBackQuery(_, c) => c.message.as_ref(),
40            _ => None,
41        }
42    }
43}
44
45impl<'r, T: Sync> FromUpdate<'r, T> for ChatId {
46    fn from_update(_: &Bot, u: &'r Update, _: Option<&BotState<T>>) -> Option<Self> {
47        match u {
48            Update::NewMessage(_, Message { chat, .. }) => Some(chat.id.into()),
49            Update::EditedMessage(_, Message { chat, .. }) => Some(chat.id.into()),
50            Update::NewChannelPost(_, Message { chat, .. }) => Some(chat.id.into()),
51            Update::EditedChannelPost(_, Message { chat, .. }) => Some(chat.id.into()),
52            Update::CallBackQuery(_, c) => c.message.as_ref().map(|m| m.chat.id.into()),
53            Update::BotStatus(_, s) => {
54                if let ChatMember::Updated { chat, .. } = s {
55                    Some(chat.id.into())
56                } else {
57                    None
58                }
59            }
60            Update::MemberStatus(_, s) => {
61                if let ChatMember::Updated { chat, .. } = s {
62                    Some(chat.id.into())
63                } else {
64                    None
65                }
66            }
67            Update::ChatJoinRequest(_, r) => Some(r.chat.id.into()),
68            _ => None,
69        }
70    }
71}