diff --git a/CHANGELOG.md b/CHANGELOG.md index e63789b8..c8f3ad5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Bug with `caption_entities`, see issue [#473][issue473] - Type of response for `CopyMessage` method ([#141](pr141), [#142](pr142)) - Bad request serialization when the `language` field of `MessageEntityKind::Pre` is `None` ([#145](pr145)) +- Deserialization of `MediaKind::Venue` ([#147][pr147]) [pr119]: https://github.com/teloxide/teloxide-core/pull/119 [pr133]: https://github.com/teloxide/teloxide-core/pull/133 @@ -60,6 +61,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 [pr142]: https://github.com/teloxide/teloxide-core/pull/142 [pr143]: https://github.com/teloxide/teloxide-core/pull/143 [pr145]: https://github.com/teloxide/teloxide-core/pull/145 +[pr147]: https://github.com/teloxide/teloxide-core/pull/147 [issue473]: https://github.com/teloxide/teloxide/issues/473 [issue427]: https://github.com/teloxide/teloxide/issues/427 diff --git a/src/types/message.rs b/src/types/message.rs index 3cf6d156..3da9f02b 100644 --- a/src/types/message.rs +++ b/src/types/message.rs @@ -286,11 +286,20 @@ pub struct ForwardOrigin { #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] #[serde(untagged)] pub enum MediaKind { + // Note: + // - `Venue` must be in front of `Location` + // - `Animation` must be in front of `Document` + // + // This is needed so serde doesn't parse `Venue` as `Location` or `Animation` as `Document` + // (for backward compatability telegram duplicates some fields) + // + // See <https://github.com/teloxide/teloxide/issues/481> Animation(MediaAnimation), Audio(MediaAudio), Contact(MediaContact), Document(MediaDocument), Game(MediaGame), + Venue(MediaVenue), Location(MediaLocation), Photo(MediaPhoto), Poll(MediaPoll), @@ -299,7 +308,6 @@ pub enum MediaKind { Video(MediaVideo), VideoNote(MediaVideoNote), Voice(MediaVoice), - Venue(MediaVenue), Migration(ChatMigration), } @@ -310,11 +318,6 @@ pub struct MediaAnimation { /// will also be set. pub animation: Animation, - #[doc(hidden)] - /// "For backward compatibility" (c) Telegram Docs. - #[serde(skip)] - pub document: (), - /// Caption for the animation, 0-1024 characters. pub caption: Option<String>, @@ -322,6 +325,7 @@ pub struct MediaAnimation { /// bot commands, etc. that appear in the caption. #[serde(default = "Vec::new")] pub caption_entities: Vec<MessageEntity>, + // Note: for backward compatibility telegram also sends `document` field, but we ignore it } #[serde_with_macros::skip_serializing_none] @@ -472,6 +476,7 @@ pub struct MediaVoice { pub struct MediaVenue { /// Message is a venue, information about the venue. pub venue: Venue, + // Note: for backward compatibility telegram also sends `location` field, but we ignore it } #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] @@ -1339,4 +1344,53 @@ mod tests { // The chat to which the group migrated assert!(message.sender_chat().is_some()); } + + /// Regression test for <https://github.com/teloxide/teloxide/issues/481> + #[test] + fn issue_481() { + let json = r#" +{ + "message_id": 0, + "date": 0, + "location": { + "latitude": 0.0, + "longitude": 0.0 + }, + "chat": { + "id": 0, + "first_name": "f", + "type": "private" + }, + "venue": { + "location": { + "latitude": 0.0, + "longitude": 0.0 + }, + "title": "Title", + "address": "Address", + "foursquare_id": "some_foursquare_id" + } + } +"#; + let message: Message = from_str(json).unwrap(); + assert_eq!( + message.venue().unwrap(), + &Venue { + location: Location { + longitude: 0.0, + latitude: 0.0, + horizontal_accuracy: None, + live_period: None, + heading: None, + proximity_alert_radius: None + }, + title: "Title".to_owned(), + address: "Address".to_owned(), + foursquare_id: Some("some_foursquare_id".to_owned()), + foursquare_type: None, + google_place_id: None, + google_place_type: None, + } + ) + } }