diff --git a/src/core/types/chat.rs b/src/core/types/chat.rs index dbfb080e..e57efa42 100644 --- a/src/core/types/chat.rs +++ b/src/core/types/chat.rs @@ -1,7 +1,7 @@ use crate::core::types::{ChatPermissions, ChatPhoto, Message}; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] pub struct Chat { pub id: i64, #[serde(flatten)] @@ -10,7 +10,7 @@ pub struct Chat { } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] #[serde(untagged)] pub enum ChatKind { NonPrivate { @@ -33,7 +33,7 @@ pub enum ChatKind { } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] #[serde(rename_all = "snake_case")] #[serde(tag = "type")] pub enum NonPrivateChatKind { diff --git a/src/core/types/document.rs b/src/core/types/document.rs index cce9004d..9c3e805b 100644 --- a/src/core/types/document.rs +++ b/src/core/types/document.rs @@ -1,6 +1,6 @@ use crate::core::types::PhotoSize; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] pub struct Document { pub file_id: String, pub thumb: Option, diff --git a/src/core/types/invoice.rs b/src/core/types/invoice.rs index de52e01c..8a429e6e 100644 --- a/src/core/types/invoice.rs +++ b/src/core/types/invoice.rs @@ -1,4 +1,4 @@ -#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone)] +#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone, Serialize)] pub struct Invoice { pub title: String, pub description: String, diff --git a/src/core/types/message.rs b/src/core/types/message.rs index 605e3901..3b2d0f08 100644 --- a/src/core/types/message.rs +++ b/src/core/types/message.rs @@ -4,7 +4,7 @@ use crate::core::types::{ SuccessfulPayment, User, Venue, Video, VideoNote, Voice, }; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] pub struct Message { #[serde(rename = "message_id")] pub id: i64, @@ -14,7 +14,7 @@ pub struct Message { pub message_kind: MessageKind, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] #[serde(untagged)] pub enum MessageKind { IncomingMessage { @@ -72,7 +72,7 @@ pub enum MessageKind { }, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] pub enum Sender { /// If message is sent from Chat #[serde(rename = "from")] @@ -82,7 +82,7 @@ pub enum Sender { Signature(String), } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] #[serde(untagged)] pub enum ForwardKind { ChannelForward { @@ -106,7 +106,7 @@ pub enum ForwardKind { }, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] pub enum ForwardedFrom { #[serde(rename = "forward_from")] User(User), @@ -114,11 +114,12 @@ pub enum ForwardedFrom { SenderName(String), } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] #[serde(untagged)] pub enum MediaKind { Animation { animation: Animation, + #[doc(hidden)] /// "For backward compatibility" (c) Telegram Docs #[serde(skip)] document: (), @@ -148,11 +149,11 @@ pub enum MediaKind { location: Location, }, Photo { - sizes: Vec, + photo: Vec, caption: Option, #[serde(default = "Vec::new")] caption_entities: Vec, - media_group_id: Option, + media_group_id: Option, }, Poll { poll: Poll, @@ -170,7 +171,7 @@ pub enum MediaKind { caption: Option, #[serde(default = "Vec::new")] caption_entities: Vec, - media_group_id: Option, + media_group_id: Option, }, VideoNote { video_note: VideoNote, @@ -227,8 +228,197 @@ mod tests { }, }; // actual message from telegram - let json = r#"{"message_id":6534,"from":{"id":457569668,"is_bot":true,"first_name":"BT","username":"BloodyTestBot"},"chat":{"id":218485655,"first_name":"W","username":"WaffleLapkin","type":"private"},"date":1567898953,"text":"text"}"#; + let json = r#"{ + "message_id": 6534, + "from": { + "id": 457569668, + "is_bot": true, + "first_name": "BT", + "username": "BloodyTestBot" + }, + "chat": { + "id": 218485655, + "first_name": "W", + "username": "WaffleLapkin", + "type": "private" + }, + "date": 1567898953, + "text": "text" +}"#; let actual = from_str::(json).unwrap(); assert_eq!(expected, actual); } + + #[test] + fn media_message_de() { + let json = r#"{ + "message_id": 198283, + "from": { + "id": 250918540, + "is_bot": false, + "first_name": "Андрей", + "last_name": "Власов", + "username": "aka_dude", + "language_code": "en" + }, + "chat": { + "id": 250918540, + "first_name": "Андрей", + "last_name": "Власов", + "username": "aka_dude", + "type": "private" + }, + "date": 1567927221, + "video": { + "duration": 13, + "width": 512, + "height": 640, + "mime_type": "video/mp4", + "thumb": { + "file_id": "AAQCAAOmBAACBf2oS53pByA-I4CWWCObDwAEAQAHbQADMWcAAhYE", + "file_size": 10339, + "width": 256, + "height": 320 + }, + "file_id": "BAADAgADpgQAAgX9qEud6QcgPiOAlhYE", + "file_size": 1381334 + } +}"#; + let actual = from_str::(json).unwrap(); + let expected = Message { + id: 198283, + date: 1567927221, + chat: Chat { + id: 250918540, + photo: None, + kind: ChatKind::Private { + first_name: Some("Андрей".to_string()), + last_name: Some("Власов".to_string()), + username: Some("aka_dude".to_string()), + type_: () + } + }, + message_kind: MessageKind::IncomingMessage { + from: Sender::User(User { + id: 250918540, + is_bot: false, + first_name: "Андрей".to_string(), + last_name: Some("Власов".to_string()), + username: Some("aka_dude".to_string()), + language_code: Some("en".to_string()) + }), + forward_kind: ForwardKind::Origin { reply_to_message: None }, + edit_date: None, + media_kind: MediaKind::Video { + video: Video { + duration: 13, + width: 512, + height: 640, + mime_type: Some("video/mp4".to_string()), + thumb: Some(PhotoSize { + file_id: "AAQCAAOmBAACBf2oS53pByA-I4CWWCObDwAEAQAHbQADMWcAAhYE".to_string(), + file_size: Some(10339), + width: 256, + height: 320 + }), + file_id: "BAADAgADpgQAAgX9qEud6QcgPiOAlhYE".to_string(), + file_size: Some(1381334) + }, + caption: None, + caption_entities: vec![], + media_group_id: None + }, + reply_markup: None + }, + + }; + assert_eq!(actual, expected); + } + + #[test] + fn media_group_message_de() { + let json = r#"{ + "message_id": 198283, + "from": { + "id": 250918540, + "is_bot": false, + "first_name": "Андрей", + "last_name": "Власов", + "username": "aka_dude", + "language_code": "en" + }, + "chat": { + "id": 250918540, + "first_name": "Андрей", + "last_name": "Власов", + "username": "aka_dude", + "type": "private" + }, + "date": 1567927221, + "media_group_id": "12543417770506682", + "video": { + "duration": 13, + "width": 512, + "height": 640, + "mime_type": "video/mp4", + "thumb": { + "file_id": "AAQCAAOmBAACBf2oS53pByA-I4CWWCObDwAEAQAHbQADMWcAAhYE", + "file_size": 10339, + "width": 256, + "height": 320 + }, + "file_id": "BAADAgADpgQAAgX9qEud6QcgPiOAlhYE", + "file_size": 1381334 + } +}"#; + let actual = from_str::(json).unwrap(); + let expected = Message { + id: 198283, + date: 1567927221, + chat: Chat { + id: 250918540, + photo: None, + kind: ChatKind::Private { + first_name: Some("Андрей".to_string()), + last_name: Some("Власов".to_string()), + username: Some("aka_dude".to_string()), + type_: () + } + }, + message_kind: MessageKind::IncomingMessage { + from: Sender::User(User { + id: 250918540, + is_bot: false, + first_name: "Андрей".to_string(), + last_name: Some("Власов".to_string()), + username: Some("aka_dude".to_string()), + language_code: Some("en".to_string()) + }), + forward_kind: ForwardKind::Origin { reply_to_message: None }, + edit_date: None, + media_kind: MediaKind::Video { + video: Video { + duration: 13, + width: 512, + height: 640, + mime_type: Some("video/mp4".to_string()), + thumb: Some(PhotoSize { + file_id: "AAQCAAOmBAACBf2oS53pByA-I4CWWCObDwAEAQAHbQADMWcAAhYE".to_string(), + file_size: Some(10339), + width: 256, + height: 320 + }), + file_id: "BAADAgADpgQAAgX9qEud6QcgPiOAlhYE".to_string(), + file_size: Some(1381334) + }, + caption: None, + caption_entities: vec![], + media_group_id: Some("12543417770506682".to_string()) + }, + reply_markup: None + }, + + }; + assert_eq!(actual, expected); + } } diff --git a/src/core/types/message_entity.rs b/src/core/types/message_entity.rs index 74563f40..e10661ac 100644 --- a/src/core/types/message_entity.rs +++ b/src/core/types/message_entity.rs @@ -1,6 +1,6 @@ use crate::core::types::User; -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] pub struct MessageEntity { #[serde(flatten)] pub kind: MessageEntityKind, @@ -8,7 +8,7 @@ pub struct MessageEntity { pub length: usize, } -#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone)] +#[derive(Debug, Deserialize, Eq, Hash, PartialEq, Clone, Serialize)] #[serde(rename_all = "snake_case")] #[serde(tag = "type")] pub enum MessageEntityKind { diff --git a/src/core/types/order_info.rs b/src/core/types/order_info.rs index f81ecdd7..dfc78c6f 100644 --- a/src/core/types/order_info.rs +++ b/src/core/types/order_info.rs @@ -1,6 +1,6 @@ use crate::core::types::ShippingAddress; -#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone)] +#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone, Serialize)] pub struct OrderInfo { pub name: String, pub phone_number: String, diff --git a/src/core/types/shipping_address.rs b/src/core/types/shipping_address.rs index 625aaa48..3923887b 100644 --- a/src/core/types/shipping_address.rs +++ b/src/core/types/shipping_address.rs @@ -1,4 +1,4 @@ -#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone)] +#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone, Serialize)] pub struct ShippingAddress { pub country_code: String, pub state: String, diff --git a/src/core/types/sticker.rs b/src/core/types/sticker.rs index 4fae9596..d962117d 100644 --- a/src/core/types/sticker.rs +++ b/src/core/types/sticker.rs @@ -1,6 +1,6 @@ use crate::core::types::{MaskPosition, PhotoSize}; -#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone)] +#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone, Serialize)] pub struct Sticker { pub file_id: String, pub width: u16, diff --git a/src/core/types/successful_payment.rs b/src/core/types/successful_payment.rs index 338c277c..8c39446d 100644 --- a/src/core/types/successful_payment.rs +++ b/src/core/types/successful_payment.rs @@ -1,6 +1,6 @@ use crate::core::types::OrderInfo; -#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone)] +#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone, Serialize)] pub struct SuccessfulPayment { pub currency: String, pub total_amount: i64, diff --git a/src/core/types/user.rs b/src/core/types/user.rs index 41da2448..19873238 100644 --- a/src/core/types/user.rs +++ b/src/core/types/user.rs @@ -1,4 +1,4 @@ -#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone)] +#[derive(Debug, Deserialize, Hash, PartialEq, Eq, Clone, Serialize)] pub struct User { pub id: i64, pub is_bot: bool,