mirror of
https://github.com/teloxide/teloxide.git
synced 2025-03-14 11:44:04 +01:00
Decompose ChatMemberKind
as was requested per review
This commit is contained in:
parent
91d78b65b3
commit
2f09e9930d
1 changed files with 185 additions and 140 deletions
|
@ -19,255 +19,300 @@ pub struct ChatMember {
|
|||
#[serde(rename_all = "snake_case")]
|
||||
#[serde(tag = "status")]
|
||||
pub enum ChatMemberKind {
|
||||
Creator {
|
||||
/// Custom title for this user.
|
||||
custom_title: Option<String>,
|
||||
},
|
||||
Administrator {
|
||||
/// Custom title for this user.
|
||||
custom_title: Option<String>,
|
||||
|
||||
/// `true`, if the bot is allowed to edit
|
||||
/// administrator privileges of that user.
|
||||
can_be_edited: bool,
|
||||
|
||||
/// `true`, if the administrator can change the chat
|
||||
/// title, photo and other settings.
|
||||
can_change_info: bool,
|
||||
|
||||
/// `true`, if the administrator can post in the
|
||||
/// channel, channels only.
|
||||
can_post_messages: Option<bool>,
|
||||
|
||||
/// `true`, if the administrator can edit messages of
|
||||
/// other users and can pin messages, channels only.
|
||||
can_edit_messages: Option<bool>,
|
||||
|
||||
/// `true`, if the administrator can delete messages
|
||||
/// of other users.
|
||||
can_delete_messages: bool,
|
||||
|
||||
/// `true`, if the administrator can invite new users
|
||||
/// to the chat.
|
||||
can_invite_users: bool,
|
||||
|
||||
/// `true`, if the administrator can restrict,
|
||||
/// ban or unban chat members.
|
||||
can_restrict_members: bool,
|
||||
|
||||
/// `true`, if the administrator can pin messages,
|
||||
/// supergroups only.
|
||||
can_pin_messages: Option<bool>,
|
||||
|
||||
/// `true`, if the administrator can add new
|
||||
/// administrators with a subset of his own privileges or demote
|
||||
/// administrators that he has promoted, directly or indirectly
|
||||
/// (promoted by administrators that were appointed by the
|
||||
/// user).
|
||||
can_promote_members: bool,
|
||||
},
|
||||
Creator(Creator),
|
||||
Administrator(Administrator),
|
||||
Member,
|
||||
Restricted {
|
||||
/// Date when restrictions will be lifted for
|
||||
/// this user, unix time.
|
||||
until_date: i32,
|
||||
|
||||
/// Restricted only. `true`, if the user can send text messages,
|
||||
/// contacts, locations and venues.
|
||||
can_send_messages: bool,
|
||||
|
||||
/// Restricted only. `true`, if the user is allowed to send audios,
|
||||
/// documents, photos, videos, video notes and voice notes.
|
||||
can_send_media_messages: bool,
|
||||
|
||||
/// Restricted only. `true`, if the user is allowed to send animations,
|
||||
/// games, stickers and use inline bots.
|
||||
can_send_other_messages: bool,
|
||||
|
||||
/// Restricted only. `true`, if the user is allowed to add web page
|
||||
/// previews to their messages.
|
||||
can_add_web_page_previews: bool,
|
||||
},
|
||||
Restricted(Restricted),
|
||||
Left,
|
||||
Kicked {
|
||||
/// Date when restrictions will be lifted for
|
||||
/// this user, unix time.
|
||||
until_date: i32,
|
||||
},
|
||||
Kicked(Kicked),
|
||||
}
|
||||
|
||||
/// Creator of the group. This struct is part of the [`ChatmemberKind`] enum.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Creator {
|
||||
/// Custom title for this user.
|
||||
pub custom_title: Option<String>,
|
||||
}
|
||||
|
||||
/// Administrator of the group. This struct is part of the [`ChatmemberKind`]
|
||||
/// enum.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Administrator {
|
||||
/// Custom title for this user.
|
||||
pub custom_title: Option<String>,
|
||||
|
||||
/// `true`, if the bot is allowed to edit
|
||||
/// administrator privileges of that user.
|
||||
pub can_be_edited: bool,
|
||||
|
||||
/// `true`, if the administrator can change the chat
|
||||
/// title, photo and other settings.
|
||||
pub can_change_info: bool,
|
||||
|
||||
/// `true`, if the administrator can post in the
|
||||
/// channel, channels only.
|
||||
pub can_post_messages: Option<bool>,
|
||||
|
||||
/// `true`, if the administrator can edit messages of
|
||||
/// other users and can pin messages, channels only.
|
||||
pub can_edit_messages: Option<bool>,
|
||||
|
||||
/// `true`, if the administrator can delete messages
|
||||
/// of other users.
|
||||
pub can_delete_messages: bool,
|
||||
|
||||
/// `true`, if the administrator can invite new users
|
||||
/// to the chat.
|
||||
pub can_invite_users: bool,
|
||||
|
||||
/// `true`, if the administrator can restrict,
|
||||
/// ban or unban chat members.
|
||||
pub can_restrict_members: bool,
|
||||
|
||||
/// `true`, if the administrator can pin messages,
|
||||
/// supergroups only.
|
||||
pub can_pin_messages: Option<bool>,
|
||||
|
||||
/// `true`, if the administrator can add new
|
||||
/// administrators with a subset of his own privileges or demote
|
||||
/// administrators that he has promoted, directly or indirectly
|
||||
/// (promoted by administrators that were appointed by the
|
||||
/// user).
|
||||
pub can_promote_members: bool,
|
||||
}
|
||||
|
||||
/// User, restricted in the group. This struct is part of the [`ChatmemberKind`]
|
||||
/// enum.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Restricted {
|
||||
/// Date when restrictions will be lifted for
|
||||
/// this user, unix time.
|
||||
pub until_date: i32,
|
||||
|
||||
/// Restricted only. `true`, if the user can send text messages,
|
||||
/// contacts, locations and venues.
|
||||
pub can_send_messages: bool,
|
||||
|
||||
/// Restricted only. `true`, if the user is allowed to send audios,
|
||||
/// documents, photos, videos, video notes and voice notes.
|
||||
pub can_send_media_messages: bool,
|
||||
|
||||
/// Restricted only. `true`, if the user is allowed to send animations,
|
||||
/// games, stickers and use inline bots.
|
||||
pub can_send_other_messages: bool,
|
||||
|
||||
/// Restricted only. `true`, if the user is allowed to add web page
|
||||
/// previews to their messages.
|
||||
pub can_add_web_page_previews: bool,
|
||||
}
|
||||
|
||||
/// User kicked from the group. This struct is part of the [`ChatmemberKind`]
|
||||
/// enum.
|
||||
#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
|
||||
pub struct Kicked {
|
||||
/// Date when restrictions will be lifted for
|
||||
/// this user, unix time.
|
||||
pub until_date: i32,
|
||||
}
|
||||
|
||||
impl ChatMember {
|
||||
pub fn status(&self) -> ChatMemberStatus {
|
||||
match &self.kind {
|
||||
ChatMemberKind::Creator { .. } => ChatMemberStatus::Creator,
|
||||
ChatMemberKind::Administrator { .. } => ChatMemberStatus::Administrator,
|
||||
ChatMemberKind::Creator(_) => ChatMemberStatus::Creator,
|
||||
ChatMemberKind::Administrator(_) => ChatMemberStatus::Administrator,
|
||||
ChatMemberKind::Member => ChatMemberStatus::Member,
|
||||
ChatMemberKind::Restricted { .. } => ChatMemberStatus::Restricted,
|
||||
ChatMemberKind::Restricted(_) => ChatMemberStatus::Restricted,
|
||||
ChatMemberKind::Left => ChatMemberStatus::Left,
|
||||
ChatMemberKind::Kicked { .. } => ChatMemberStatus::Kicked,
|
||||
ChatMemberKind::Kicked(_) => ChatMemberStatus::Kicked,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ChatMemberKind {
|
||||
/// Getter for [`Administrator::custom_title`] and [`Creator::custom_title`]
|
||||
/// fields.
|
||||
pub fn custom_title(&self) -> Option<&str> {
|
||||
match &self {
|
||||
Self::Administrator { custom_title, .. } | Self::Creator { custom_title, .. } => {
|
||||
//Some(custom_title.as_str())
|
||||
custom_title.as_deref()
|
||||
}
|
||||
Self::Member | Self::Restricted { .. } | Self::Left | Self::Kicked { .. } => None,
|
||||
Self::Administrator(Administrator { custom_title, .. })
|
||||
| Self::Creator(Creator { custom_title, .. }) => custom_title.as_deref(),
|
||||
Self::Member | Self::Restricted(_) | Self::Left | Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Restricted::until_date`] and [`Kicked::until_date`] fields.
|
||||
pub fn until_date(&self) -> Option<i32> {
|
||||
match &self {
|
||||
Self::Creator { .. } | Self::Administrator { .. } | Self::Member | Self::Left => None,
|
||||
Self::Restricted { until_date, .. } | Self::Kicked { until_date, .. } => {
|
||||
Some(*until_date)
|
||||
}
|
||||
Self::Creator(_) | Self::Administrator(_) | Self::Member | Self::Left => None,
|
||||
Self::Restricted(Restricted { until_date, .. })
|
||||
| Self::Kicked(Kicked { until_date, .. }) => Some(*until_date),
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_be_edited`] field.
|
||||
pub fn can_be_edited(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_be_edited, .. } => Some(*can_be_edited),
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_be_edited, .. }) => Some(*can_be_edited),
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_change_info`] field.
|
||||
pub fn can_change_info(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_change_info, .. } => Some(*can_change_info),
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_change_info, .. }) => Some(*can_change_info),
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_post_messages`] field.
|
||||
pub fn can_post_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_post_messages, .. } => *can_post_messages,
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_post_messages, .. }) => *can_post_messages,
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_edit_messages`] field.
|
||||
pub fn can_edit_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_edit_messages, .. } => *can_edit_messages,
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_edit_messages, .. }) => *can_edit_messages,
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_delete_messages`] field.
|
||||
pub fn can_delete_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_delete_messages, .. } => Some(*can_delete_messages),
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_delete_messages, .. }) => {
|
||||
Some(*can_delete_messages)
|
||||
}
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_invite_users`] field.
|
||||
pub fn can_invite_users(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_invite_users, .. } => Some(*can_invite_users),
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_invite_users, .. }) => Some(*can_invite_users),
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_restrict_members`] field.
|
||||
pub fn can_restrict_members(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_restrict_members, .. } => Some(*can_restrict_members),
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_restrict_members, .. }) => {
|
||||
Some(*can_restrict_members)
|
||||
}
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_pin_messages`] field.
|
||||
pub fn can_pin_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_pin_messages, .. } => *can_pin_messages,
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_pin_messages, .. }) => *can_pin_messages,
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Administrator::can_promote_members`] field.
|
||||
pub fn can_promote_members(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Administrator { can_promote_members, .. } => Some(*can_promote_members),
|
||||
Self::Creator { .. }
|
||||
Self::Administrator(Administrator { can_promote_members, .. }) => {
|
||||
Some(*can_promote_members)
|
||||
}
|
||||
Self::Creator(_)
|
||||
| Self::Member
|
||||
| Self::Restricted { .. }
|
||||
| Self::Restricted(_)
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Restricted::can_send_messages`] field.
|
||||
pub fn can_send_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Restricted { can_send_messages, .. } => Some(*can_send_messages),
|
||||
Self::Creator { .. }
|
||||
| Self::Administrator { .. }
|
||||
Self::Restricted(Restricted { can_send_messages, .. }) => Some(*can_send_messages),
|
||||
Self::Creator(_)
|
||||
| Self::Administrator(_)
|
||||
| Self::Member
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Restricted::can_send_media_messages`] field.
|
||||
pub fn can_send_media_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Restricted { can_send_media_messages, .. } => Some(*can_send_media_messages),
|
||||
Self::Creator { .. }
|
||||
| Self::Administrator { .. }
|
||||
Self::Restricted(Restricted { can_send_media_messages, .. }) => {
|
||||
Some(*can_send_media_messages)
|
||||
}
|
||||
Self::Creator(_)
|
||||
| Self::Administrator(_)
|
||||
| Self::Member
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Restricted::can_send_other_messages`] field.
|
||||
pub fn can_send_other_messages(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Restricted { can_send_other_messages, .. } => Some(*can_send_other_messages),
|
||||
Self::Creator { .. }
|
||||
| Self::Administrator { .. }
|
||||
Self::Restricted(Restricted { can_send_other_messages, .. }) => {
|
||||
Some(*can_send_other_messages)
|
||||
}
|
||||
Self::Creator(_)
|
||||
| Self::Administrator(_)
|
||||
| Self::Member
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
/// Getter for [`Restricted::can_add_web_page_previews`] field.
|
||||
pub fn can_add_web_page_previews(&self) -> Option<bool> {
|
||||
match &self {
|
||||
Self::Restricted { can_add_web_page_previews, .. } => Some(*can_add_web_page_previews),
|
||||
Self::Creator { .. }
|
||||
| Self::Administrator { .. }
|
||||
Self::Restricted(Restricted { can_add_web_page_previews, .. }) => {
|
||||
Some(*can_add_web_page_previews)
|
||||
}
|
||||
Self::Creator(_)
|
||||
| Self::Administrator(_)
|
||||
| Self::Member
|
||||
| Self::Left
|
||||
| Self::Kicked { .. } => None,
|
||||
| Self::Kicked(_) => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -316,7 +361,7 @@ mod tests {
|
|||
username: Some("fl".to_string()),
|
||||
language_code: Some("en".to_string()),
|
||||
},
|
||||
kind: ChatMemberKind::Administrator {
|
||||
kind: ChatMemberKind::Administrator(Administrator {
|
||||
custom_title: None,
|
||||
can_be_edited: false,
|
||||
can_change_info: true,
|
||||
|
@ -327,7 +372,7 @@ mod tests {
|
|||
can_restrict_members: true,
|
||||
can_pin_messages: Some(true),
|
||||
can_promote_members: true,
|
||||
},
|
||||
}),
|
||||
};
|
||||
let actual = serde_json::from_str::<ChatMember>(&json).unwrap();
|
||||
assert_eq!(actual, expected)
|
||||
|
|
Loading…
Add table
Reference in a new issue