telegram_bot2/
from_update.rs1use crate::models::{ChatId, ChatMember, Message, Update};
2use crate::{Bot, BotState};
3
4pub trait FromUpdate<'r, T: Sync>
7where
8 Self: Sized,
9{
10 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}