1use serde::de::{Deserialize, Deserializer, Error};
2
3use crate::types::*;
4
5#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Deserialize)]
7pub struct User {
8 pub id: UserId,
10 pub first_name: String,
12 pub last_name: Option<String>,
14 pub username: Option<String>,
16 pub is_bot: bool,
18 pub language_code: Option<String>,
20}
21
22#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Deserialize)]
24pub struct Group {
25 pub id: GroupId,
27 pub title: String,
29 pub all_members_are_administrators: bool,
31 pub invite_link: Option<String>,
35}
36
37#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Deserialize)]
39pub struct Supergroup {
40 pub id: SupergroupId,
42 pub title: String,
44 pub username: Option<String>,
46 pub invite_link: Option<String>,
50}
51
52#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Deserialize)]
54pub struct Channel {
55 pub id: ChannelId,
57 pub title: String,
59 pub username: Option<String>,
61 pub invite_link: Option<String>,
65}
66
67#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
69pub enum MessageChat {
70 Private(User),
71 Group(Group),
72 Supergroup(Supergroup),
73 #[doc(hidden)]
74 Unknown(RawChat),
75}
76
77impl MessageChat {
78 pub fn id(&self) -> ChatId {
79 match *self {
80 MessageChat::Private(ref x) => x.id.into(),
81 MessageChat::Group(ref x) => x.id.into(),
82 MessageChat::Supergroup(ref x) => x.id.into(),
83 MessageChat::Unknown(ref x) => x.id.into(),
84 }
85 }
86}
87
88#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash)]
90pub enum Chat {
91 Private(User),
92 Group(Group),
93 Supergroup(Supergroup),
94 Channel(Channel),
95 #[doc(hidden)]
96 Unknown(RawChat),
97}
98
99impl Chat {
100 pub fn id(&self) -> ChatId {
101 match *self {
102 Chat::Private(ref x) => x.id.into(),
103 Chat::Group(ref x) => x.id.into(),
104 Chat::Supergroup(ref x) => x.id.into(),
105 Chat::Channel(ref x) => x.id.into(),
106 Chat::Unknown(ref x) => x.id.into(),
107 }
108 }
109}
110
111impl<'de> Deserialize<'de> for Chat {
112 fn deserialize<D>(deserializer: D) -> Result<Chat, D::Error>
113 where
114 D: Deserializer<'de>,
115 {
116 let raw: RawChat = Deserialize::deserialize(deserializer)?;
117
118 macro_rules! required_field {
119 ($name:ident) => {{
120 match raw.$name {
121 Some(val) => val,
122 None => return Err(D::Error::missing_field(stringify!($name))),
123 }
124 }};
125 }
126
127 Ok(match raw.type_.as_ref() {
128 "private" => Chat::Private(User {
129 id: raw.id.into(),
130 username: raw.username,
131 first_name: required_field!(first_name),
132 last_name: raw.last_name,
133 is_bot: false,
134 language_code: raw.language_code,
135 }),
136 "group" => Chat::Group(Group {
137 id: raw.id.into(),
138 title: required_field!(title),
139 all_members_are_administrators: required_field!(all_members_are_administrators),
140 invite_link: raw.invite_link,
141 }),
142 "supergroup" => Chat::Supergroup(Supergroup {
143 id: raw.id.into(),
144 title: required_field!(title),
145 username: raw.username,
146 invite_link: raw.invite_link,
147 }),
148 "channel" => Chat::Channel(Channel {
149 id: raw.id.into(),
150 title: required_field!(title),
151 username: raw.username,
152 invite_link: raw.invite_link,
153 }),
154 _ => Chat::Unknown(raw),
155 })
156 }
157}
158
159#[derive(Debug, Clone, PartialEq, PartialOrd, Eq, Ord, Hash, Deserialize)]
161pub struct RawChat {
162 pub id: Integer,
164 #[serde(rename = "type")]
166 pub type_: String,
167 pub title: Option<String>,
169 pub username: Option<String>,
171 pub first_name: Option<String>,
173 pub last_name: Option<String>,
175 pub invite_link: Option<String>,
178 pub language_code: Option<String>,
180 pub all_members_are_administrators: Option<bool>,
182}