1use serde::{Deserialize, Serialize};
2use serde_json::Value as JsonValue;
3
4use self::raw::*;
5use crate::types::{
6 Animation,
7 Audio,
8 ChatBackground,
9 Checklist,
10 ChecklistTasksAdded,
11 ChecklistTasksDone,
12 Contact,
13 Dice,
14 Document,
15 ForumTopicIconColor,
16 Game,
17 GiftInfo,
18 Giveaway,
19 GiveawayCompleted,
20 GiveawayCreated,
21 GiveawayWinners,
22 Integer,
23 Invoice,
24 Location,
25 MaybeInaccessibleMessage,
26 PaidMediaInfo,
27 PassportData,
28 PhotoSize,
29 Poll,
30 RefundedPayment,
31 SharedUser,
32 Sticker,
33 Story,
34 SuccessfulPayment,
35 Text,
36 UniqueGiftInfo,
37 User,
38 Venue,
39 Video,
40 VideoNote,
41 Voice,
42 WebAppData,
43};
44
45#[cfg(test)]
46mod tests;
47
48mod raw;
49
50#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
52#[allow(clippy::large_enum_variant)]
53#[serde(rename_all = "snake_case")]
54pub enum MessageData {
55 Animation(Animation),
57 #[serde(rename = "message_auto_delete_timer_changed")]
59 AutoDeleteTimerChanged(MessageDataAutoDeleteTimer),
60 #[serde(
64 deserialize_with = "RawDataBoostAdded::deserialize_value",
65 serialize_with = "RawDataBoostAdded::serialize_value"
66 )]
67 BoostAdded(Integer),
68 #[serde(
75 deserialize_with = "RawDataFlag::deserialize_value",
76 serialize_with = "RawDataFlag::serialize_value"
77 )]
78 ChannelChatCreated,
79 ChatBackgroundSet(ChatBackground),
81 ChatShared(MessageDataChatShared),
83 Checklist(Checklist),
85 ChecklistTasksAdded(ChecklistTasksAdded),
87 ChecklistTasksDone(ChecklistTasksDone),
89 ConnectedWebsite(String),
91 Contact(Contact),
93 #[serde(
95 deserialize_with = "RawDataFlag::deserialize_value",
96 serialize_with = "RawDataFlag::serialize_value"
97 )]
98 DeleteChatPhoto,
99 Dice(Dice),
101 DirectMessagePriceChanged(MessageDataDirectMessagePriceChanged),
103 #[serde(
105 deserialize_with = "RawDataEmpty::deserialize_value",
106 serialize_with = "RawDataEmpty::serialize_value"
107 )]
108 ForumTopicClosed,
109 ForumTopicCreated(MessageDataForumTopicCreated),
111 ForumTopicEdited(MessageDataForumTopicEdited),
113 #[serde(
115 deserialize_with = "RawDataEmpty::deserialize_value",
116 serialize_with = "RawDataEmpty::serialize_value"
117 )]
118 ForumTopicReopened,
119 Game(Game),
121 Gift(GiftInfo),
123 #[serde(
125 deserialize_with = "RawDataEmpty::deserialize_value",
126 serialize_with = "RawDataEmpty::serialize_value"
127 )]
128 GeneralForumTopicHidden,
129 #[serde(
131 deserialize_with = "RawDataEmpty::deserialize_value",
132 serialize_with = "RawDataEmpty::serialize_value"
133 )]
134 GeneralForumTopicUnhidden,
135 Giveaway(Giveaway),
137 GiveawayCreated(GiveawayCreated),
139 GiveawayCompleted(GiveawayCompleted),
141 GiveawayWinners(GiveawayWinners),
143 #[serde(
145 deserialize_with = "RawDataFlag::deserialize_value",
146 serialize_with = "RawDataFlag::serialize_value"
147 )]
148 GroupChatCreated,
149 Invoice(Invoice),
151 LeftChatMember(User),
155 Location(Location),
157 MigrateFromChatId(Integer),
159 MigrateToChatId(Integer),
161 NewChatMembers(Vec<User>),
165 NewChatPhoto(Vec<PhotoSize>),
167 NewChatTitle(String),
169 PaidMedia(PaidMediaInfo),
171 PaidMessagePriceChanged(MessageDataPaidMessagePriceChanged),
173 PassportData(PassportData),
175 PinnedMessage(MaybeInaccessibleMessage),
180 Poll(Poll),
182 ProximityAlertTriggered(MessageDataProximityAlert),
184 RefundedPayment(RefundedPayment),
186 Sticker(Sticker),
188 Story(Story),
190 SuccessfulPayment(SuccessfulPayment),
192 #[serde(
200 deserialize_with = "RawDataFlag::deserialize_value",
201 serialize_with = "RawDataFlag::serialize_value"
202 )]
203 SupergroupChatCreated,
204 UniqueGift(UniqueGiftInfo),
206 UsersShared(MessageDataUsersShared),
208 Venue(Venue),
210 VideoNote(VideoNote),
212 VideoChatEnded(MessageDataVideoChatEnded),
214 VideoChatParticipantsInvited(MessageDataVideoChatParticipantsInvited),
216 VideoChatScheduled(MessageDataVideoChatScheduled),
218 #[serde(
220 deserialize_with = "RawDataEmpty::deserialize_value",
221 serialize_with = "RawDataEmpty::serialize_value"
222 )]
223 VideoChatStarted,
224 WebAppData(WebAppData),
226 WriteAccessAllowed(MessageDataWriteAccess),
232 #[serde(untagged)]
234 Audio(MessageDataAudio),
235 #[serde(untagged)]
237 Document(MessageDataDocument),
238 #[serde(untagged)]
240 Photo(MessageDataPhoto),
241 #[serde(
243 deserialize_with = "RawDataText::deserialize_value",
244 serialize_with = "RawDataText::serialize_value",
245 untagged
246 )]
247 Text(Text),
248 #[serde(untagged)]
250 Video(MessageDataVideo),
251 #[serde(untagged)]
253 Voice(MessageDataVoice),
254 #[serde(untagged)]
256 Unknown(JsonValue),
257}
258
259#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
261pub struct MessageDataAutoDeleteTimer {
262 #[serde(rename = "message_auto_delete_time")]
264 pub time: Integer,
265}
266
267impl MessageDataAutoDeleteTimer {
268 pub fn new(time: Integer) -> Self {
274 Self { time }
275 }
276}
277
278#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
280#[serde_with::skip_serializing_none]
281pub struct MessageDataAudio {
282 #[serde(rename = "audio")]
284 pub data: Audio,
285 #[serde(
287 flatten,
288 deserialize_with = "RawCaption::deserialize_value",
289 serialize_with = "RawCaption::serialize_value"
290 )]
291 pub caption: Option<Text>,
292}
293
294impl From<Audio> for MessageDataAudio {
295 fn from(value: Audio) -> Self {
296 Self {
297 data: value,
298 caption: None,
299 }
300 }
301}
302
303impl MessageDataAudio {
304 pub fn with_caption<T>(mut self, value: T) -> Self
310 where
311 T: Into<Text>,
312 {
313 self.caption = Some(value.into());
314 self
315 }
316}
317
318#[serde_with::skip_serializing_none]
322#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
323pub struct MessageDataChatShared {
324 pub chat_id: Integer,
329 pub request_id: Integer,
331 pub photo: Option<Vec<PhotoSize>>,
333 pub title: Option<String>,
335 pub username: Option<String>,
337}
338
339impl MessageDataChatShared {
340 pub fn new(chat_id: Integer, request_id: Integer) -> Self {
347 Self {
348 chat_id,
349 request_id,
350 title: None,
351 username: None,
352 photo: None,
353 }
354 }
355
356 pub fn with_photo<T>(mut self, value: T) -> Self
362 where
363 T: IntoIterator<Item = PhotoSize>,
364 {
365 self.photo = Some(value.into_iter().collect());
366 self
367 }
368
369 pub fn with_title<T>(mut self, value: T) -> Self
375 where
376 T: Into<String>,
377 {
378 self.title = Some(value.into());
379 self
380 }
381
382 pub fn with_username<T>(mut self, value: T) -> Self
388 where
389 T: Into<String>,
390 {
391 self.username = Some(value.into());
392 self
393 }
394}
395
396#[serde_with::skip_serializing_none]
398#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
399pub struct MessageDataDocument {
400 #[serde(rename = "document")]
402 pub data: Document,
403 #[serde(
405 flatten,
406 deserialize_with = "RawCaption::deserialize_value",
407 serialize_with = "RawCaption::serialize_value"
408 )]
409 pub caption: Option<Text>,
410}
411
412impl From<Document> for MessageDataDocument {
413 fn from(value: Document) -> Self {
414 Self {
415 data: value,
416 caption: None,
417 }
418 }
419}
420
421impl MessageDataDocument {
422 pub fn with_caption<T>(mut self, value: T) -> Self
428 where
429 T: Into<Text>,
430 {
431 self.caption = Some(value.into());
432 self
433 }
434}
435
436#[serde_with::skip_serializing_none]
438#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
439pub struct MessageDataForumTopicCreated {
440 pub icon_color: ForumTopicIconColor,
442 pub name: String,
444 pub icon_custom_emoji_id: Option<String>,
446}
447
448impl MessageDataForumTopicCreated {
449 pub fn new<A, B>(icon_color: A, name: B) -> Self
456 where
457 A: Into<ForumTopicIconColor>,
458 B: Into<String>,
459 {
460 Self {
461 icon_color: icon_color.into(),
462 name: name.into(),
463 icon_custom_emoji_id: None,
464 }
465 }
466
467 pub fn with_icon_custom_emoji_id<T>(mut self, value: T) -> Self
473 where
474 T: Into<String>,
475 {
476 self.icon_custom_emoji_id = Some(value.into());
477 self
478 }
479}
480
481#[serde_with::skip_serializing_none]
483#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
484pub struct MessageDataForumTopicEdited {
485 pub name: Option<String>,
487 pub icon_custom_emoji_id: Option<String>,
490}
491
492impl MessageDataForumTopicEdited {
493 pub fn with_name<T>(mut self, value: T) -> Self
499 where
500 T: Into<String>,
501 {
502 self.name = Some(value.into());
503 self
504 }
505
506 pub fn with_icon_custom_emoji_id<T>(mut self, value: T) -> Self
512 where
513 T: Into<String>,
514 {
515 self.icon_custom_emoji_id = Some(value.into());
516 self
517 }
518}
519
520#[derive(Clone, Copy, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
522pub struct MessageDataPaidMessagePriceChanged {
523 pub paid_message_star_count: Integer,
526}
527
528#[serde_with::skip_serializing_none]
530#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
531pub struct MessageDataDirectMessagePriceChanged {
532 pub are_direct_messages_enabled: bool,
534 pub direct_message_star_count: Option<Integer>,
539}
540
541impl MessageDataDirectMessagePriceChanged {
542 pub fn new(are_direct_messages_enabled: bool) -> Self {
548 Self {
549 are_direct_messages_enabled,
550 direct_message_star_count: None,
551 }
552 }
553
554 pub fn with_direct_message_star_count(mut self, value: Integer) -> Self {
560 self.direct_message_star_count = Some(value);
561 self
562 }
563}
564
565#[serde_with::skip_serializing_none]
567#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
568pub struct MessageDataPhoto {
569 #[serde(rename = "photo")]
571 pub data: Vec<PhotoSize>,
572 #[serde(
574 flatten,
575 deserialize_with = "RawCaption::deserialize_value",
576 serialize_with = "RawCaption::serialize_value"
577 )]
578 pub caption: Option<Text>,
579}
580
581impl<T> From<T> for MessageDataPhoto
582where
583 T: IntoIterator<Item = PhotoSize>,
584{
585 fn from(value: T) -> Self {
586 Self {
587 data: value.into_iter().collect(),
588 caption: None,
589 }
590 }
591}
592
593impl MessageDataPhoto {
594 pub fn with_caption<T>(mut self, value: T) -> Self
600 where
601 T: Into<Text>,
602 {
603 self.caption = Some(value.into());
604 self
605 }
606}
607
608#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
612pub struct MessageDataProximityAlert {
613 pub distance: Integer,
615 pub traveler: User,
617 pub watcher: User,
619}
620
621impl MessageDataProximityAlert {
622 pub fn new(distance: Integer, traveler: User, watcher: User) -> Self {
630 Self {
631 distance,
632 traveler,
633 watcher,
634 }
635 }
636}
637
638#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
642pub struct MessageDataUsersShared {
643 pub request_id: Integer,
645 pub users: Vec<SharedUser>,
647}
648
649impl MessageDataUsersShared {
650 pub fn new<T>(request_id: Integer, users: T) -> Self
657 where
658 T: IntoIterator<Item = SharedUser>,
659 {
660 Self {
661 request_id,
662 users: users.into_iter().collect(),
663 }
664 }
665}
666
667#[serde_with::skip_serializing_none]
669#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
670pub struct MessageDataVideo {
671 #[serde(rename = "video")]
673 pub data: Video,
674 #[serde(
676 flatten,
677 deserialize_with = "RawCaption::deserialize_value",
678 serialize_with = "RawCaption::serialize_value"
679 )]
680 pub caption: Option<Text>,
681}
682
683impl From<Video> for MessageDataVideo {
684 fn from(value: Video) -> Self {
685 Self {
686 data: value,
687 caption: None,
688 }
689 }
690}
691
692impl MessageDataVideo {
693 pub fn with_caption<T>(mut self, value: T) -> Self
699 where
700 T: Into<Text>,
701 {
702 self.caption = Some(value.into());
703 self
704 }
705}
706
707#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
709pub struct MessageDataVideoChatEnded {
710 pub duration: Integer,
712}
713
714impl MessageDataVideoChatEnded {
715 pub fn new(duration: Integer) -> Self {
721 Self { duration }
722 }
723}
724
725#[serde_with::skip_serializing_none]
727#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
728pub struct MessageDataVideoChatParticipantsInvited {
729 pub users: Option<Vec<User>>,
731}
732
733impl<T> From<T> for MessageDataVideoChatParticipantsInvited
734where
735 T: IntoIterator<Item = User>,
736{
737 fn from(value: T) -> Self {
738 Self::default().with_users(value)
739 }
740}
741
742impl MessageDataVideoChatParticipantsInvited {
743 pub fn with_users<T>(mut self, value: T) -> Self
749 where
750 T: IntoIterator<Item = User>,
751 {
752 self.users = Some(value.into_iter().collect());
753 self
754 }
755}
756
757#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
759pub struct MessageDataVideoChatScheduled {
760 pub start_date: Integer,
763}
764
765impl MessageDataVideoChatScheduled {
766 pub fn new(start_date: Integer) -> Self {
772 Self { start_date }
773 }
774}
775
776#[serde_with::skip_serializing_none]
778#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
779pub struct MessageDataVoice {
780 #[serde(rename = "voice")]
782 pub data: Voice,
783 #[serde(
785 flatten,
786 deserialize_with = "RawCaption::deserialize_value",
787 serialize_with = "RawCaption::serialize_value"
788 )]
789 pub caption: Option<Text>,
790}
791
792impl From<Voice> for MessageDataVoice {
793 fn from(value: Voice) -> Self {
794 Self {
795 data: value,
796 caption: None,
797 }
798 }
799}
800
801impl MessageDataVoice {
802 pub fn with_caption<T>(mut self, value: T) -> Self
808 where
809 T: Into<Text>,
810 {
811 self.caption = Some(value.into());
812 self
813 }
814}
815
816#[serde_with::skip_serializing_none]
822#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
823pub struct MessageDataWriteAccess {
824 pub from_attachment_menu: Option<bool>,
826 pub from_request: Option<bool>,
829 pub web_app_name: Option<String>,
832}
833
834impl MessageDataWriteAccess {
835 pub fn with_from_attachment_menu(mut self, value: bool) -> Self {
841 self.from_attachment_menu = Some(value);
842 self
843 }
844
845 pub fn with_from_request(mut self, value: bool) -> Self {
850 self.from_request = Some(value);
851 self
852 }
853
854 pub fn with_web_app_name<T>(mut self, value: T) -> Self
860 where
861 T: Into<String>,
862 {
863 self.web_app_name = Some(value.into());
864 self
865 }
866}