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 SuggestedPostApprovalFailed,
36 SuggestedPostApproved,
37 SuggestedPostDeclined,
38 SuggestedPostPaid,
39 SuggestedPostRefunded,
40 Text,
41 UniqueGiftInfo,
42 User,
43 Venue,
44 Video,
45 VideoNote,
46 Voice,
47 WebAppData,
48};
49
50mod raw;
51
52#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
54#[allow(clippy::large_enum_variant)]
55#[serde(rename_all = "snake_case")]
56pub enum MessageData {
57 Animation(Animation),
59 #[serde(rename = "message_auto_delete_timer_changed")]
61 AutoDeleteTimerChanged(MessageDataAutoDeleteTimer),
62 #[serde(
66 deserialize_with = "RawDataBoostAdded::deserialize_value",
67 serialize_with = "RawDataBoostAdded::serialize_value"
68 )]
69 BoostAdded(Integer),
70 #[serde(
77 deserialize_with = "RawDataFlag::deserialize_value",
78 serialize_with = "RawDataFlag::serialize_value"
79 )]
80 ChannelChatCreated,
81 ChatBackgroundSet(ChatBackground),
83 ChatShared(MessageDataChatShared),
85 Checklist(Checklist),
87 ChecklistTasksAdded(ChecklistTasksAdded),
89 ChecklistTasksDone(ChecklistTasksDone),
91 ConnectedWebsite(String),
93 Contact(Contact),
95 #[serde(
97 deserialize_with = "RawDataFlag::deserialize_value",
98 serialize_with = "RawDataFlag::serialize_value"
99 )]
100 DeleteChatPhoto,
101 Dice(Dice),
103 DirectMessagePriceChanged(MessageDataDirectMessagePriceChanged),
105 #[serde(
107 deserialize_with = "RawDataEmpty::deserialize_value",
108 serialize_with = "RawDataEmpty::serialize_value"
109 )]
110 ForumTopicClosed,
111 ForumTopicCreated(MessageDataForumTopicCreated),
113 ForumTopicEdited(MessageDataForumTopicEdited),
115 #[serde(
117 deserialize_with = "RawDataEmpty::deserialize_value",
118 serialize_with = "RawDataEmpty::serialize_value"
119 )]
120 ForumTopicReopened,
121 Game(Game),
123 Gift(GiftInfo),
125 #[serde(
127 deserialize_with = "RawDataEmpty::deserialize_value",
128 serialize_with = "RawDataEmpty::serialize_value"
129 )]
130 GeneralForumTopicHidden,
131 #[serde(
133 deserialize_with = "RawDataEmpty::deserialize_value",
134 serialize_with = "RawDataEmpty::serialize_value"
135 )]
136 GeneralForumTopicUnhidden,
137 Giveaway(Giveaway),
139 GiveawayCreated(GiveawayCreated),
141 GiveawayCompleted(GiveawayCompleted),
143 GiveawayWinners(GiveawayWinners),
145 #[serde(
147 deserialize_with = "RawDataFlag::deserialize_value",
148 serialize_with = "RawDataFlag::serialize_value"
149 )]
150 GroupChatCreated,
151 Invoice(Invoice),
153 LeftChatMember(User),
157 Location(Location),
159 MigrateFromChatId(Integer),
161 MigrateToChatId(Integer),
163 NewChatMembers(Vec<User>),
167 NewChatPhoto(Vec<PhotoSize>),
169 NewChatTitle(String),
171 PaidMedia(PaidMediaInfo),
173 PaidMessagePriceChanged(MessageDataPaidMessagePriceChanged),
175 PassportData(PassportData),
177 PinnedMessage(MaybeInaccessibleMessage),
182 Poll(Poll),
184 ProximityAlertTriggered(MessageDataProximityAlert),
186 RefundedPayment(RefundedPayment),
188 Sticker(Sticker),
190 Story(Story),
192 SuggestedPostApproved(SuggestedPostApproved),
194 SuggestedPostApprovalFailed(SuggestedPostApprovalFailed),
196 SuggestedPostDeclined(SuggestedPostDeclined),
198 SuggestedPostPaid(SuggestedPostPaid),
200 SuggestedPostRefunded(SuggestedPostRefunded),
202 SuccessfulPayment(SuccessfulPayment),
204 #[serde(
212 deserialize_with = "RawDataFlag::deserialize_value",
213 serialize_with = "RawDataFlag::serialize_value"
214 )]
215 SupergroupChatCreated,
216 UniqueGift(UniqueGiftInfo),
218 UsersShared(MessageDataUsersShared),
220 Venue(Venue),
222 VideoNote(VideoNote),
224 VideoChatEnded(MessageDataVideoChatEnded),
226 VideoChatParticipantsInvited(MessageDataVideoChatParticipantsInvited),
228 VideoChatScheduled(MessageDataVideoChatScheduled),
230 #[serde(
232 deserialize_with = "RawDataEmpty::deserialize_value",
233 serialize_with = "RawDataEmpty::serialize_value"
234 )]
235 VideoChatStarted,
236 WebAppData(WebAppData),
238 WriteAccessAllowed(MessageDataWriteAccess),
244 #[serde(untagged)]
246 Audio(MessageDataAudio),
247 #[serde(untagged)]
249 Document(MessageDataDocument),
250 #[serde(untagged)]
252 Photo(MessageDataPhoto),
253 #[serde(
255 deserialize_with = "RawDataText::deserialize_value",
256 serialize_with = "RawDataText::serialize_value",
257 untagged
258 )]
259 Text(Text),
260 #[serde(untagged)]
262 Video(MessageDataVideo),
263 #[serde(untagged)]
265 Voice(MessageDataVoice),
266 #[serde(untagged)]
268 Unknown(JsonValue),
269}
270
271#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
273pub struct MessageDataAutoDeleteTimer {
274 #[serde(rename = "message_auto_delete_time")]
276 pub time: Integer,
277}
278
279impl MessageDataAutoDeleteTimer {
280 pub fn new(time: Integer) -> Self {
286 Self { time }
287 }
288}
289
290#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
292#[serde_with::skip_serializing_none]
293pub struct MessageDataAudio {
294 #[serde(rename = "audio")]
296 pub data: Audio,
297 #[serde(
299 flatten,
300 deserialize_with = "RawCaption::deserialize_value",
301 serialize_with = "RawCaption::serialize_value"
302 )]
303 pub caption: Option<Text>,
304}
305
306impl From<Audio> for MessageDataAudio {
307 fn from(value: Audio) -> Self {
308 Self {
309 data: value,
310 caption: None,
311 }
312 }
313}
314
315impl MessageDataAudio {
316 pub fn with_caption<T>(mut self, value: T) -> Self
322 where
323 T: Into<Text>,
324 {
325 self.caption = Some(value.into());
326 self
327 }
328}
329
330#[serde_with::skip_serializing_none]
334#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
335pub struct MessageDataChatShared {
336 pub chat_id: Integer,
341 pub request_id: Integer,
343 pub photo: Option<Vec<PhotoSize>>,
345 pub title: Option<String>,
347 pub username: Option<String>,
349}
350
351impl MessageDataChatShared {
352 pub fn new(chat_id: Integer, request_id: Integer) -> Self {
359 Self {
360 chat_id,
361 request_id,
362 title: None,
363 username: None,
364 photo: None,
365 }
366 }
367
368 pub fn with_photo<T>(mut self, value: T) -> Self
374 where
375 T: IntoIterator<Item = PhotoSize>,
376 {
377 self.photo = Some(value.into_iter().collect());
378 self
379 }
380
381 pub fn with_title<T>(mut self, value: T) -> Self
387 where
388 T: Into<String>,
389 {
390 self.title = Some(value.into());
391 self
392 }
393
394 pub fn with_username<T>(mut self, value: T) -> Self
400 where
401 T: Into<String>,
402 {
403 self.username = Some(value.into());
404 self
405 }
406}
407
408#[serde_with::skip_serializing_none]
410#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
411pub struct MessageDataDocument {
412 #[serde(rename = "document")]
414 pub data: Document,
415 #[serde(
417 flatten,
418 deserialize_with = "RawCaption::deserialize_value",
419 serialize_with = "RawCaption::serialize_value"
420 )]
421 pub caption: Option<Text>,
422}
423
424impl From<Document> for MessageDataDocument {
425 fn from(value: Document) -> Self {
426 Self {
427 data: value,
428 caption: None,
429 }
430 }
431}
432
433impl MessageDataDocument {
434 pub fn with_caption<T>(mut self, value: T) -> Self
440 where
441 T: Into<Text>,
442 {
443 self.caption = Some(value.into());
444 self
445 }
446}
447
448#[serde_with::skip_serializing_none]
450#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
451pub struct MessageDataForumTopicCreated {
452 pub icon_color: ForumTopicIconColor,
454 pub name: String,
456 pub icon_custom_emoji_id: Option<String>,
458}
459
460impl MessageDataForumTopicCreated {
461 pub fn new<A, B>(icon_color: A, name: B) -> Self
468 where
469 A: Into<ForumTopicIconColor>,
470 B: Into<String>,
471 {
472 Self {
473 icon_color: icon_color.into(),
474 name: name.into(),
475 icon_custom_emoji_id: None,
476 }
477 }
478
479 pub fn with_icon_custom_emoji_id<T>(mut self, value: T) -> Self
485 where
486 T: Into<String>,
487 {
488 self.icon_custom_emoji_id = Some(value.into());
489 self
490 }
491}
492
493#[serde_with::skip_serializing_none]
495#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
496pub struct MessageDataForumTopicEdited {
497 pub name: Option<String>,
499 pub icon_custom_emoji_id: Option<String>,
502}
503
504impl MessageDataForumTopicEdited {
505 pub fn with_name<T>(mut self, value: T) -> Self
511 where
512 T: Into<String>,
513 {
514 self.name = Some(value.into());
515 self
516 }
517
518 pub fn with_icon_custom_emoji_id<T>(mut self, value: T) -> Self
524 where
525 T: Into<String>,
526 {
527 self.icon_custom_emoji_id = Some(value.into());
528 self
529 }
530}
531
532#[derive(Clone, Copy, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
534pub struct MessageDataPaidMessagePriceChanged {
535 pub paid_message_star_count: Integer,
538}
539
540#[serde_with::skip_serializing_none]
542#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
543pub struct MessageDataDirectMessagePriceChanged {
544 pub are_direct_messages_enabled: bool,
546 pub direct_message_star_count: Option<Integer>,
551}
552
553impl MessageDataDirectMessagePriceChanged {
554 pub fn new(are_direct_messages_enabled: bool) -> Self {
560 Self {
561 are_direct_messages_enabled,
562 direct_message_star_count: None,
563 }
564 }
565
566 pub fn with_direct_message_star_count(mut self, value: Integer) -> Self {
572 self.direct_message_star_count = Some(value);
573 self
574 }
575}
576
577#[serde_with::skip_serializing_none]
579#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
580pub struct MessageDataPhoto {
581 #[serde(rename = "photo")]
583 pub data: Vec<PhotoSize>,
584 #[serde(
586 flatten,
587 deserialize_with = "RawCaption::deserialize_value",
588 serialize_with = "RawCaption::serialize_value"
589 )]
590 pub caption: Option<Text>,
591}
592
593impl<T> From<T> for MessageDataPhoto
594where
595 T: IntoIterator<Item = PhotoSize>,
596{
597 fn from(value: T) -> Self {
598 Self {
599 data: value.into_iter().collect(),
600 caption: None,
601 }
602 }
603}
604
605impl MessageDataPhoto {
606 pub fn with_caption<T>(mut self, value: T) -> Self
612 where
613 T: Into<Text>,
614 {
615 self.caption = Some(value.into());
616 self
617 }
618}
619
620#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
624pub struct MessageDataProximityAlert {
625 pub distance: Integer,
627 pub traveler: User,
629 pub watcher: User,
631}
632
633impl MessageDataProximityAlert {
634 pub fn new(distance: Integer, traveler: User, watcher: User) -> Self {
642 Self {
643 distance,
644 traveler,
645 watcher,
646 }
647 }
648}
649
650#[derive(Clone, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
654pub struct MessageDataUsersShared {
655 pub request_id: Integer,
657 pub users: Vec<SharedUser>,
659}
660
661impl MessageDataUsersShared {
662 pub fn new<T>(request_id: Integer, users: T) -> Self
669 where
670 T: IntoIterator<Item = SharedUser>,
671 {
672 Self {
673 request_id,
674 users: users.into_iter().collect(),
675 }
676 }
677}
678
679#[serde_with::skip_serializing_none]
681#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
682pub struct MessageDataVideo {
683 #[serde(rename = "video")]
685 pub data: Video,
686 #[serde(
688 flatten,
689 deserialize_with = "RawCaption::deserialize_value",
690 serialize_with = "RawCaption::serialize_value"
691 )]
692 pub caption: Option<Text>,
693}
694
695impl From<Video> for MessageDataVideo {
696 fn from(value: Video) -> Self {
697 Self {
698 data: value,
699 caption: None,
700 }
701 }
702}
703
704impl MessageDataVideo {
705 pub fn with_caption<T>(mut self, value: T) -> Self
711 where
712 T: Into<Text>,
713 {
714 self.caption = Some(value.into());
715 self
716 }
717}
718
719#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
721pub struct MessageDataVideoChatEnded {
722 pub duration: Integer,
724}
725
726impl MessageDataVideoChatEnded {
727 pub fn new(duration: Integer) -> Self {
733 Self { duration }
734 }
735}
736
737#[serde_with::skip_serializing_none]
739#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
740pub struct MessageDataVideoChatParticipantsInvited {
741 pub users: Option<Vec<User>>,
743}
744
745impl<T> From<T> for MessageDataVideoChatParticipantsInvited
746where
747 T: IntoIterator<Item = User>,
748{
749 fn from(value: T) -> Self {
750 Self::default().with_users(value)
751 }
752}
753
754impl MessageDataVideoChatParticipantsInvited {
755 pub fn with_users<T>(mut self, value: T) -> Self
761 where
762 T: IntoIterator<Item = User>,
763 {
764 self.users = Some(value.into_iter().collect());
765 self
766 }
767}
768
769#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
771pub struct MessageDataVideoChatScheduled {
772 pub start_date: Integer,
775}
776
777impl MessageDataVideoChatScheduled {
778 pub fn new(start_date: Integer) -> Self {
784 Self { start_date }
785 }
786}
787
788#[serde_with::skip_serializing_none]
790#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
791pub struct MessageDataVoice {
792 #[serde(rename = "voice")]
794 pub data: Voice,
795 #[serde(
797 flatten,
798 deserialize_with = "RawCaption::deserialize_value",
799 serialize_with = "RawCaption::serialize_value"
800 )]
801 pub caption: Option<Text>,
802}
803
804impl From<Voice> for MessageDataVoice {
805 fn from(value: Voice) -> Self {
806 Self {
807 data: value,
808 caption: None,
809 }
810 }
811}
812
813impl MessageDataVoice {
814 pub fn with_caption<T>(mut self, value: T) -> Self
820 where
821 T: Into<Text>,
822 {
823 self.caption = Some(value.into());
824 self
825 }
826}
827
828#[serde_with::skip_serializing_none]
834#[derive(Clone, Debug, Default, Deserialize, PartialEq, PartialOrd, Serialize)]
835pub struct MessageDataWriteAccess {
836 pub from_attachment_menu: Option<bool>,
838 pub from_request: Option<bool>,
841 pub web_app_name: Option<String>,
844}
845
846impl MessageDataWriteAccess {
847 pub fn with_from_attachment_menu(mut self, value: bool) -> Self {
853 self.from_attachment_menu = Some(value);
854 self
855 }
856
857 pub fn with_from_request(mut self, value: bool) -> Self {
862 self.from_request = Some(value);
863 self
864 }
865
866 pub fn with_web_app_name<T>(mut self, value: T) -> Self
872 where
873 T: Into<String>,
874 {
875 self.web_app_name = Some(value.into());
876 self
877 }
878}