From 5bfe47927d84add0a37caf9f6d9147d115418aa1 Mon Sep 17 00:00:00 2001 From: Mr-Andersen Date: Sat, 7 Sep 2019 14:58:47 +0300 Subject: [PATCH 1/7] Added Message --- src/core/types/chat.rs | 52 +++++------- src/core/types/message.rs | 174 ++++++++++++++++++++++++++++++++++++-- src/core/types/mod.rs | 4 +- 3 files changed, 191 insertions(+), 39 deletions(-) diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index 1382d6a8..d7226044 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -1,18 +1,18 @@ use crate::core::types::{ChatPermissions, ChatPhoto, Message}; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] pub struct Chat { #[serde(rename = "chat_id")] - pub id: i32, + pub id: i64, #[serde(flatten)] - pub type_: ChatType, + pub chat_kind: ChatKind, #[serde(skip_serializing_if = "Option::is_none")] pub photo: Option, } -struct PrivateChatTypeVisitor; +struct PrivateChatKindVisitor; -impl<'de> serde::de::Visitor<'de> for PrivateChatTypeVisitor { +impl<'de> serde::de::Visitor<'de> for PrivateChatKindVisitor { type Value = (); fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { @@ -36,51 +36,43 @@ impl<'de> serde::de::Visitor<'de> for PrivateChatTypeVisitor { fn assert_private_field<'de, D: serde::Deserializer<'de>>( des: D, ) -> Result<(), D::Error> { - des.deserialize_str(PrivateChatTypeVisitor) + des.deserialize_str(PrivateChatKindVisitor) } -fn serialize_private_field( +/*fn serialize_private_field( _: &(), ser: S, ) -> Result { ser.serialize_str("private") -} +}*/ -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] -#[serde(rename_all = "snake_case")] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] #[serde(untagged)] -pub enum ChatType { - NotPrivate { - #[serde(skip_serializing_if = "Option::is_none")] +pub enum ChatKind { + NonPrivate { title: Option, #[serde(flatten)] - type_: NotPrivateChatType, - #[serde(skip_serializing_if = "Option::is_none")] + non_private_chat_kind: NonPrivateChatKind, description: Option, - #[serde(skip_serializing_if = "Option::is_none")] invite_link: Option, - #[serde(skip_serializing_if = "Option::is_none")] pinned_message: Option>, }, Private { /// Dummy field. Used to ensure that "type" field is equal to "private" #[serde(rename = "type")] #[serde(deserialize_with = "assert_private_field")] - #[serde(serialize_with = "serialize_private_field")] + // #[serde(serialize_with = "serialize_private_field")] type_: (), - #[serde(skip_serializing_if = "Option::is_none")] username: Option, - #[serde(skip_serializing_if = "Option::is_none")] first_name: Option, - #[serde(skip_serializing_if = "Option::is_none")] last_name: Option, }, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] #[serde(rename_all = "snake_case")] #[serde(tag = "type")] -pub enum NotPrivateChatType { +pub enum NonPrivateChatKind { Channel { username: Option, }, @@ -98,16 +90,16 @@ pub enum NotPrivateChatType { #[cfg(test)] mod tests { use crate::core::types::*; - use serde_json::{from_str, to_string}; + use serde_json::from_str; #[test] fn channel_de() { assert_eq!( Chat { id: -1, - type_: ChatType::NotPrivate { + chat_kind: ChatKind::NonPrivate { title: None, - type_: NotPrivateChatType::Channel { + non_private_chat_kind: NonPrivateChatKind::Channel { username: Some("channelname".into()) }, description: None, @@ -128,7 +120,7 @@ mod tests { assert_eq!( Chat { id: 0, - type_: ChatType::Private { + chat_kind: ChatKind::Private { type_: (), username: Some("username".into()), first_name: Some("Anon".into()), @@ -146,12 +138,12 @@ mod tests { assert!(from_str::(r#"{"chat_id":0,"type":"WRONG"}"#).is_err()); } - #[test] + /*#[test] fn private_chat_ser() { assert_eq!( to_string(&Chat { id: 0, - type_: ChatType::Private { + type_: ChatKind::Private { type_: (), username: None, first_name: None, @@ -162,5 +154,5 @@ mod tests { .unwrap(), r#"{"chat_id":0,"type":"private"}"#.to_owned() ); - } + }*/ } diff --git a/src/core/types/message.rs b/src/core/types/message.rs index 636693e1..d58a7abd 100644 --- a/src/core/types/message.rs +++ b/src/core/types/message.rs @@ -4,17 +4,177 @@ use crate::core::types::{ SuccessfulPayment, User, Venue, Video, VideoNote, Voice, }; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] pub struct Message { #[serde(rename = "message_id")] - pub id: i32, + pub id: i64, pub date: i32, - pub chat: Chat, + pub chat: Box, #[serde(flatten)] - pub type_: MessageType, + pub message_kind: MessageKind, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Serialize)] -#[serde(rename_all = "snake_case")] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] #[serde(untagged)] -pub enum MessageType {} +pub enum MessageKind { + IncomingMessage { + #[serde(flatten)] + forward_kind: ForwardKind, + edit_date: Option, + #[serde(flatten)] + media_kind: MediaKind, + reply_markup: Option, + }, + NewChatMembers { + new_chat_members: Vec, + }, + LeftChatMember { + left_chat_member: User, + }, + NewChatTitle { + new_chat_title: String, + }, + NewChatPhoto { + new_chat_photo: Vec, + }, + DeleteChatPhoto { + delete_chat_photo: bool, + }, + GroupChatCreated { + group_chat_created: bool, + }, + SupergroupChatCreated { + supergroup_chat_created: bool, + }, + ChannelChatCreated { + channel_chat_created: bool, + }, + Migrate { + migrate_to_chat_id: i64, + migrate_from_chat_id: i64, + }, + PinnedMessage { + pinned_message: Box, + }, + Invoice { + invoice: Invoice, + }, + SuccessfulPayment { + successful_payment: SuccessfulPayment, + }, + ConnectedWebsite { + connected_website: String, + }, + PassportData { + passport_data: PassportData, + }, +} + +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[serde(untagged)] +pub enum ForwardKind { + ChannelForward { + forward_from_channel: Box, + forward_from_message_id: i64, + forward_signature: String, + }, + NonChannelForward { + #[serde(flatten)] + forward: UserOrSenderName, + }, + Origin { + reply_to_message: Option>, + }, +} + +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[serde(untagged)] +pub enum UserOrSenderName { + User { from: User }, + SenderName { sender_name: String }, +} + +#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[serde(untagged)] +pub enum MediaKind { + Animation { + animation: Animation, + caption: Option, + }, + Audio { + audio: Audio, + caption: Option, + }, + Contact { + contact: Contact, + }, + Document { + document: Document, + caption: Option, + }, + Game { + game: Game, + }, + Location { + location: Location, + }, + Photo { + sizes: Vec, + caption: Option, + }, + Poll { + poll: Poll, + }, + Sticker { + sticker: Sticker, + }, + Text { + text: String, + entities: Vec, + }, + Video { + video: Video, + caption: Option, + }, + VideoNote { + video_note: VideoNote, + }, + Voice { + voice: Voice, + caption: Option, + }, + Venue { + venue: Venue, + }, +} + +#[cfg(test)] +mod tests { + use crate::core::types::*; + use serde_json::from_str; + + #[test] + fn incoming_origin_de() { + assert_eq!(Message { + id: 0, + date: 0, + chat: Box::new(Chat { + id: 0, + chat_kind: ChatKind::Private { + type_: (), + username: None, + first_name: None, + last_name: None + }, + photo: None + }), + message_kind: MessageKind::IncomingMessage { + forward_kind: ForwardKind::Origin { reply_to_message: None }, + edit_date: None, + media_kind: MediaKind::Text { text: "Hello".to_string(), entities: vec![] }, + reply_markup: None + } + }, + from_str(r#"{"message_id":0,"date":0,"chat":{"chat_id":0,"type":"private"},"text":"Hello","entities":[]}"#).unwrap()); + } +} diff --git a/src/core/types/mod.rs b/src/core/types/mod.rs index 26531b6d..d1a801b2 100644 --- a/src/core/types/mod.rs +++ b/src/core/types/mod.rs @@ -4,7 +4,7 @@ pub use self::{ answer_pre_checkout_query::AnswerPreCheckoutQuery, answer_shipping_query::AnswerShippingQuery, audio::Audio, - chat::{Chat, ChatType, NotPrivateChatType}, + chat::{Chat, ChatKind, NonPrivateChatKind}, chat_member::ChatMember, chat_permissions::ChatPermissions, chat_photo::ChatPhoto, @@ -13,7 +13,7 @@ pub use self::{ input_media::InputMedia, invoice::Invoice, label_price::LabeledPrice, - message::Message, + message::{ForwardKind, MediaKind, Message, MessageKind, UserOrSenderName}, message_entity::MessageEntity, order_info::OrderInfo, parse_mode::ParseMode, From cc86b2a73ded5271211634d8e0c135117f104333 Mon Sep 17 00:00:00 2001 From: Andrew Andersen Date: Sat, 7 Sep 2019 18:27:25 +0300 Subject: [PATCH 2/7] Update src/core/types/chat.rs Co-Authored-By: Waffle Lapkin --- src/core/types/chat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index d7226044..07c7d425 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -5,7 +5,7 @@ pub struct Chat { #[serde(rename = "chat_id")] pub id: i64, #[serde(flatten)] - pub chat_kind: ChatKind, + pub kind: ChatKind, #[serde(skip_serializing_if = "Option::is_none")] pub photo: Option, } From bca625a9b360f18e11c42cff05f944bbeb566a23 Mon Sep 17 00:00:00 2001 From: Andrew Andersen Date: Sat, 7 Sep 2019 18:28:06 +0300 Subject: [PATCH 3/7] Update src/core/types/chat.rs Co-Authored-By: Waffle Lapkin --- src/core/types/chat.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index 07c7d425..cbde0063 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -52,7 +52,7 @@ pub enum ChatKind { NonPrivate { title: Option, #[serde(flatten)] - non_private_chat_kind: NonPrivateChatKind, + kind: NonPrivateChatKind, description: Option, invite_link: Option, pinned_message: Option>, From a74715f888d7fb3e30a949ceafbaeb59782297ba Mon Sep 17 00:00:00 2001 From: Andrew Andersen Date: Sat, 7 Sep 2019 18:30:48 +0300 Subject: [PATCH 4/7] Update src/core/types/message.rs Co-Authored-By: Waffle Lapkin --- src/core/types/message.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/types/message.rs b/src/core/types/message.rs index d58a7abd..f4732aab 100644 --- a/src/core/types/message.rs +++ b/src/core/types/message.rs @@ -89,7 +89,7 @@ pub enum ForwardKind { #[derive(Debug, Deserialize, Eq, Hash, PartialEq)] #[serde(untagged)] -pub enum UserOrSenderName { +pub enum ForwardedFrom { User { from: User }, SenderName { sender_name: String }, } From 620ffe55804e3b25e25e55fb0ff69b8999662df2 Mon Sep 17 00:00:00 2001 From: Mr-Andersen Date: Sat, 7 Sep 2019 19:08:32 +0300 Subject: [PATCH 5/7] Fixes --- src/core/types/chat.rs | 74 +++++++++++++++++---------------------- src/core/types/message.rs | 51 ++++++++++++++++++--------- src/core/types/mod.rs | 2 +- 3 files changed, 69 insertions(+), 58 deletions(-) diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index cbde0063..a8a40a10 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -6,46 +6,9 @@ pub struct Chat { pub id: i64, #[serde(flatten)] pub kind: ChatKind, - #[serde(skip_serializing_if = "Option::is_none")] pub photo: Option, } -struct PrivateChatKindVisitor; - -impl<'de> serde::de::Visitor<'de> for PrivateChatKindVisitor { - type Value = (); - - fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, r#"field equal to "private""#) - } - - fn visit_borrowed_str( - self, - v: &'de str, - ) -> Result { - match v { - "private" => Ok(()), - _ => Err(E::invalid_value( - serde::de::Unexpected::Str(v), - &r#""private""#, - )), - } - } -} - -fn assert_private_field<'de, D: serde::Deserializer<'de>>( - des: D, -) -> Result<(), D::Error> { - des.deserialize_str(PrivateChatKindVisitor) -} - -/*fn serialize_private_field( - _: &(), - ser: S, -) -> Result { - ser.serialize_str("private") -}*/ - #[derive(Debug, Deserialize, Eq, Hash, PartialEq)] #[serde(untagged)] pub enum ChatKind { @@ -61,7 +24,6 @@ pub enum ChatKind { /// Dummy field. Used to ensure that "type" field is equal to "private" #[serde(rename = "type")] #[serde(deserialize_with = "assert_private_field")] - // #[serde(serialize_with = "serialize_private_field")] type_: (), username: Option, first_name: Option, @@ -87,6 +49,36 @@ pub enum NonPrivateChatKind { }, } +struct PrivateChatKindVisitor; + +impl<'de> serde::de::Visitor<'de> for PrivateChatKindVisitor { + type Value = (); + + fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, r#"field equal to "private""#) + } + + fn visit_borrowed_str( + self, + v: &'de str, + ) -> Result { + match v { + "private" => Ok(()), + _ => Err(E::invalid_value( + serde::de::Unexpected::Str(v), + &r#""private""#, + )), + } + } +} + +fn assert_private_field<'de, D>(des: D) -> Result<(), D::Error> +where + D: serde::Deserializer<'de>, +{ + des.deserialize_str(PrivateChatKindVisitor) +} + #[cfg(test)] mod tests { use crate::core::types::*; @@ -97,9 +89,9 @@ mod tests { assert_eq!( Chat { id: -1, - chat_kind: ChatKind::NonPrivate { + kind: ChatKind::NonPrivate { title: None, - non_private_chat_kind: NonPrivateChatKind::Channel { + kind: NonPrivateChatKind::Channel { username: Some("channelname".into()) }, description: None, @@ -120,7 +112,7 @@ mod tests { assert_eq!( Chat { id: 0, - chat_kind: ChatKind::Private { + kind: ChatKind::Private { type_: (), username: Some("username".into()), first_name: Some("Anon".into()), diff --git a/src/core/types/message.rs b/src/core/types/message.rs index f4732aab..d8b4c957 100644 --- a/src/core/types/message.rs +++ b/src/core/types/message.rs @@ -74,13 +74,20 @@ pub enum MessageKind { #[serde(untagged)] pub enum ForwardKind { ChannelForward { - forward_from_channel: Box, - forward_from_message_id: i64, - forward_signature: String, + #[serde(rename = "forward_date")] + date: i32, + #[serde(rename = "forward_from_chat")] + chat: Box, + #[serde(rename = "forward_from_message_id")] + message_id: i64, + #[serde(rename = "forward_signature")] + signature: Option, }, NonChannelForward { + #[serde(rename = "forward_date")] + date: i32, #[serde(flatten)] - forward: UserOrSenderName, + from: ForwardedFrom, }, Origin { reply_to_message: Option>, @@ -90,8 +97,14 @@ pub enum ForwardKind { #[derive(Debug, Deserialize, Eq, Hash, PartialEq)] #[serde(untagged)] pub enum ForwardedFrom { - User { from: User }, - SenderName { sender_name: String }, + User { + #[serde(rename = "forward_from")] + user: User, + }, + SenderName { + #[serde(rename = "forward_sender_name")] + sender_name: String, + }, } #[derive(Debug, Deserialize, Eq, Hash, PartialEq)] @@ -155,26 +168,32 @@ mod tests { #[test] fn incoming_origin_de() { - assert_eq!(Message { + let expected = Message { id: 0, date: 0, chat: Box::new(Chat { id: 0, - chat_kind: ChatKind::Private { + kind: ChatKind::Private { type_: (), username: None, first_name: None, - last_name: None + last_name: None, }, - photo: None + photo: None, }), message_kind: MessageKind::IncomingMessage { - forward_kind: ForwardKind::Origin { reply_to_message: None }, + forward_kind: ForwardKind::Origin { + reply_to_message: None, + }, edit_date: None, - media_kind: MediaKind::Text { text: "Hello".to_string(), entities: vec![] }, - reply_markup: None - } - }, - from_str(r#"{"message_id":0,"date":0,"chat":{"chat_id":0,"type":"private"},"text":"Hello","entities":[]}"#).unwrap()); + media_kind: MediaKind::Text { + text: "Hello".to_string(), + entities: vec![], + }, + reply_markup: None, + }, + }; + let actual = from_str(r#"{"message_id":0,"date":0,"chat":{"chat_id":0,"type":"private"},"text":"Hello","entities":[]}"#).unwrap(); + assert_eq!(expected, actual); } } diff --git a/src/core/types/mod.rs b/src/core/types/mod.rs index d1a801b2..046fc284 100644 --- a/src/core/types/mod.rs +++ b/src/core/types/mod.rs @@ -13,7 +13,7 @@ pub use self::{ input_media::InputMedia, invoice::Invoice, label_price::LabeledPrice, - message::{ForwardKind, MediaKind, Message, MessageKind, UserOrSenderName}, + message::{ForwardKind, ForwardedFrom, MediaKind, Message, MessageKind}, message_entity::MessageEntity, order_info::OrderInfo, parse_mode::ParseMode, From 0d6bb9840b614a86658c1669f5692eae6a04ad93 Mon Sep 17 00:00:00 2001 From: Mr-Andersen Date: Sat, 7 Sep 2019 21:05:18 +0300 Subject: [PATCH 6/7] 1. Box -> Chat; 2. assert_eq!( //much code//, //same// ) -> expected & actual; 3. User { user: User } -> User(User) --- src/core/types/chat.rs | 51 ++++++++++------------------- src/core/types/message.rs | 67 ++++++++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 50 deletions(-) diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index a8a40a10..2e0af7a4 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -86,25 +86,24 @@ mod tests { #[test] fn channel_de() { - assert_eq!( - Chat { - id: -1, - kind: ChatKind::NonPrivate { - title: None, - kind: NonPrivateChatKind::Channel { - username: Some("channelname".into()) - }, - description: None, - invite_link: None, - pinned_message: None + let expected = Chat { + id: -1, + kind: ChatKind::NonPrivate { + title: None, + kind: NonPrivateChatKind::Channel { + username: Some("channelname".into()), }, - photo: None, + description: None, + invite_link: None, + pinned_message: None, }, - from_str( - r#"{"chat_id":-1,"type":"channel","username":"channelname"}"# - ) - .unwrap() - ); + photo: None, + }; + let actual = from_str( + r#"{"chat_id":-1,"type":"channel","username":"channelname"}"#, + ) + .unwrap(); + assert_eq!(expected, actual); } #[test] @@ -129,22 +128,4 @@ mod tests { fn private_chat_de_wrong_type_field() { assert!(from_str::(r#"{"chat_id":0,"type":"WRONG"}"#).is_err()); } - - /*#[test] - fn private_chat_ser() { - assert_eq!( - to_string(&Chat { - id: 0, - type_: ChatKind::Private { - type_: (), - username: None, - first_name: None, - last_name: None - }, - photo: None - }) - .unwrap(), - r#"{"chat_id":0,"type":"private"}"#.to_owned() - ); - }*/ } diff --git a/src/core/types/message.rs b/src/core/types/message.rs index d8b4c957..6d4c26bd 100644 --- a/src/core/types/message.rs +++ b/src/core/types/message.rs @@ -9,7 +9,7 @@ pub struct Message { #[serde(rename = "message_id")] pub id: i64, pub date: i32, - pub chat: Box, + pub chat: Chat, #[serde(flatten)] pub message_kind: MessageKind, } @@ -77,7 +77,7 @@ pub enum ForwardKind { #[serde(rename = "forward_date")] date: i32, #[serde(rename = "forward_from_chat")] - chat: Box, + chat: Chat, #[serde(rename = "forward_from_message_id")] message_id: i64, #[serde(rename = "forward_signature")] @@ -95,16 +95,11 @@ pub enum ForwardKind { } #[derive(Debug, Deserialize, Eq, Hash, PartialEq)] -#[serde(untagged)] pub enum ForwardedFrom { - User { - #[serde(rename = "forward_from")] - user: User, - }, - SenderName { - #[serde(rename = "forward_sender_name")] - sender_name: String, - }, + #[serde(rename = "forward_from")] + User(User), + #[serde(rename = "forward_sender_name")] + SenderName(String), } #[derive(Debug, Deserialize, Eq, Hash, PartialEq)] @@ -167,11 +162,11 @@ mod tests { use serde_json::from_str; #[test] - fn incoming_origin_de() { + fn origin_de() { let expected = Message { id: 0, date: 0, - chat: Box::new(Chat { + chat: Chat { id: 0, kind: ChatKind::Private { type_: (), @@ -180,7 +175,7 @@ mod tests { last_name: None, }, photo: None, - }), + }, message_kind: MessageKind::IncomingMessage { forward_kind: ForwardKind::Origin { reply_to_message: None, @@ -193,7 +188,49 @@ mod tests { reply_markup: None, }, }; - let actual = from_str(r#"{"message_id":0,"date":0,"chat":{"chat_id":0,"type":"private"},"text":"Hello","entities":[]}"#).unwrap(); + let actual = from_str::(r#"{"message_id":0,"date":0,"chat":{"chat_id":0,"type":"private"},"text":"Hello","entities":[]}"#).unwrap(); + assert_eq!(expected, actual); + } + + #[test] + fn forward_de() { + let expected = Message { + id: 1, + date: 1, + chat: Chat { + id: 1, + kind: ChatKind::Private { + type_: (), + username: None, + first_name: None, + last_name: None, + }, + photo: None, + }, + message_kind: MessageKind::IncomingMessage { + forward_kind: ForwardKind::NonChannelForward { + date: 1, + from: ForwardedFrom::User(User { + id: 123, + is_bot: false, + first_name: "Name".to_string(), + last_name: None, + username: None, + language_code: None, + }), + }, + edit_date: None, + media_kind: MediaKind::Text { + text: "Message".into(), + entities: vec![], + }, + reply_markup: None, + }, + }; + let actual = from_str::( + r#"{"message_id":1,"date":1,"chat":{"chat_id":1,"type":"private"},"forward_date":1,"forward_from":{"id":123,"is_bot":false,"first_name":"Name"},"text":"Message","entities":[]}"#, + ) + .unwrap(); assert_eq!(expected, actual); } } From e1a4036d823471f85b0e42da20a98dde7023f4a3 Mon Sep 17 00:00:00 2001 From: Waffle Date: Sat, 7 Sep 2019 21:30:56 +0300 Subject: [PATCH 7/7] Implement `Clone` on `ForwardKind`, `ForwardedFrom`, `MediaKind` and `ChatKind` --- src/core/types/chat.rs | 2 +- src/core/types/message.rs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index 67c1ac35..dd944722 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -11,7 +11,7 @@ pub struct Chat { } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] #[serde(untagged)] pub enum ChatKind { NonPrivate { diff --git a/src/core/types/message.rs b/src/core/types/message.rs index 5aa83964..3c7d0f78 100644 --- a/src/core/types/message.rs +++ b/src/core/types/message.rs @@ -72,7 +72,7 @@ pub enum MessageKind { }, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] #[serde(untagged)] pub enum ForwardKind { ChannelForward { @@ -96,7 +96,7 @@ pub enum ForwardKind { }, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] pub enum ForwardedFrom { #[serde(rename = "forward_from")] User(User), @@ -104,7 +104,7 @@ pub enum ForwardedFrom { SenderName(String), } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] #[serde(untagged)] pub enum MediaKind { Animation {