1use serde::{Deserialize, Serialize};
5use serde_json::Value;
6use std::collections::HashMap;
7
8#[derive(Deserialize, Serialize, Debug, Clone)]
10pub struct Update {
11    pub update_id: i64,
13    #[serde(skip_serializing_if = "Option::is_none")]
15    pub message: Option<Message>,
16    #[serde(skip_serializing_if = "Option::is_none")]
18    pub edited_message: Option<Message>,
19    #[serde(skip_serializing_if = "Option::is_none")]
21    pub channel_post: Option<Message>,
22    #[serde(skip_serializing_if = "Option::is_none")]
24    pub edited_channel_post: Option<Message>,
25    #[serde(skip_serializing_if = "Option::is_none")]
27    pub inline_query: Option<InlineQuery>,
28    #[serde(skip_serializing_if = "Option::is_none")]
30    pub chosen_inline_result: Option<ChosenInlineResult>,
31    #[serde(skip_serializing_if = "Option::is_none")]
33    pub callback_query: Option<CallbackQuery>,
34    #[serde(skip_serializing_if = "Option::is_none")]
36    pub shipping_query: Option<ShippingQuery>,
37    #[serde(skip_serializing_if = "Option::is_none")]
39    pub pre_checkout_query: Option<PreCheckoutQuery>,
40    #[serde(skip_serializing_if = "Option::is_none")]
42    pub poll: Option<Poll>,
43    #[serde(skip_serializing_if = "Option::is_none")]
45    pub poll_answer: Option<PollAnswer>,
46    #[serde(skip_serializing_if = "Option::is_none")]
48    pub my_chat_member: Option<ChatMemberUpdated>,
49    #[serde(skip_serializing_if = "Option::is_none")]
51    pub chat_member: Option<ChatMemberUpdated>,
52    #[serde(skip_serializing_if = "Option::is_none")]
54    pub chat_join_request: Option<ChatJoinRequest>,
55}
56impl Update {
57    pub fn new(update_id: i64) -> Self {
58        Self {
59            update_id,
60            message: None,
61            edited_message: None,
62            channel_post: None,
63            edited_channel_post: None,
64            inline_query: None,
65            chosen_inline_result: None,
66            callback_query: None,
67            shipping_query: None,
68            pre_checkout_query: None,
69            poll: None,
70            poll_answer: None,
71            my_chat_member: None,
72            chat_member: None,
73            chat_join_request: None,
74        }
75    }
76}
77
78#[derive(Deserialize, Serialize, Debug, Clone)]
80pub struct WebhookInfo {
81    pub url: String,
83    pub has_custom_certificate: bool,
85    pub pending_update_count: i64,
87    #[serde(skip_serializing_if = "Option::is_none")]
89    pub ip_address: Option<String>,
90    #[serde(skip_serializing_if = "Option::is_none")]
92    pub last_error_date: Option<i64>,
93    #[serde(skip_serializing_if = "Option::is_none")]
95    pub last_error_message: Option<String>,
96    #[serde(skip_serializing_if = "Option::is_none")]
98    pub last_synchronization_error_date: Option<i64>,
99    #[serde(skip_serializing_if = "Option::is_none")]
101    pub max_connections: Option<i64>,
102    #[serde(skip_serializing_if = "Option::is_none")]
104    pub allowed_updates: Option<Vec<String>>,
105}
106impl WebhookInfo {
107    pub fn new(url: String, has_custom_certificate: bool, pending_update_count: i64) -> Self {
108        Self {
109            url,
110            has_custom_certificate,
111            pending_update_count,
112            ip_address: None,
113            last_error_date: None,
114            last_error_message: None,
115            last_synchronization_error_date: None,
116            max_connections: None,
117            allowed_updates: None,
118        }
119    }
120}
121
122#[derive(Deserialize, Serialize, Debug, Clone)]
124pub struct User {
125    pub id: i64,
127    pub is_bot: bool,
129    pub first_name: String,
131    #[serde(skip_serializing_if = "Option::is_none")]
133    pub last_name: Option<String>,
134    #[serde(skip_serializing_if = "Option::is_none")]
136    pub username: Option<String>,
137    #[serde(skip_serializing_if = "Option::is_none")]
139    pub language_code: Option<String>,
140    #[serde(skip_serializing_if = "Option::is_none")]
142    pub is_premium: Option<bool>,
143    #[serde(skip_serializing_if = "Option::is_none")]
145    pub added_to_attachment_menu: Option<bool>,
146    #[serde(skip_serializing_if = "Option::is_none")]
148    pub can_join_groups: Option<bool>,
149    #[serde(skip_serializing_if = "Option::is_none")]
151    pub can_read_all_group_messages: Option<bool>,
152    #[serde(skip_serializing_if = "Option::is_none")]
154    pub supports_inline_queries: Option<bool>,
155}
156impl User {
157    pub fn new(id: i64, is_bot: bool, first_name: String) -> Self {
158        Self {
159            id,
160            is_bot,
161            first_name,
162            last_name: None,
163            username: None,
164            language_code: None,
165            is_premium: None,
166            added_to_attachment_menu: None,
167            can_join_groups: None,
168            can_read_all_group_messages: None,
169            supports_inline_queries: None,
170        }
171    }
172}
173
174#[derive(Deserialize, Serialize, Debug, Clone)]
176pub enum ChatType {
177    #[serde(rename = "private")]
178    Private,
179    #[serde(rename = "group")]
180    Group,
181    #[serde(rename = "supergroup")]
182    Supergroup,
183    #[serde(rename = "channel")]
184    Channel,
185}
186
187#[derive(Deserialize, Serialize, Debug, Clone)]
189pub struct Chat {
190    pub id: i64,
192    #[serde(rename = "type")]
194    type_name: ChatType,
195    #[serde(skip_serializing_if = "Option::is_none")]
197    pub title: Option<String>,
198    #[serde(skip_serializing_if = "Option::is_none")]
200    pub username: Option<String>,
201    #[serde(skip_serializing_if = "Option::is_none")]
203    pub first_name: Option<String>,
204    #[serde(skip_serializing_if = "Option::is_none")]
206    pub last_name: Option<String>,
207    #[serde(skip_serializing_if = "Option::is_none")]
209    pub photo: Option<ChatPhoto>,
210    #[serde(skip_serializing_if = "Option::is_none")]
212    pub bio: Option<String>,
213    #[serde(skip_serializing_if = "Option::is_none")]
215    pub has_private_forwards: Option<bool>,
216    #[serde(skip_serializing_if = "Option::is_none")]
218    pub has_restricted_voice_and_video_messages: Option<bool>,
219    #[serde(skip_serializing_if = "Option::is_none")]
221    pub join_to_send_messages: Option<bool>,
222    #[serde(skip_serializing_if = "Option::is_none")]
224    pub join_by_request: Option<bool>,
225    #[serde(skip_serializing_if = "Option::is_none")]
227    pub description: Option<String>,
228    #[serde(skip_serializing_if = "Option::is_none")]
230    pub invite_link: Option<String>,
231    #[serde(skip_serializing_if = "Option::is_none")]
233    pub pinned_message: Option<Message>,
234    #[serde(skip_serializing_if = "Option::is_none")]
236    pub permissions: Option<ChatPermissions>,
237    #[serde(skip_serializing_if = "Option::is_none")]
239    pub slow_mode_delay: Option<i64>,
240    #[serde(skip_serializing_if = "Option::is_none")]
242    pub message_auto_delete_time: Option<i64>,
243    #[serde(skip_serializing_if = "Option::is_none")]
245    pub has_protected_content: Option<bool>,
246    #[serde(skip_serializing_if = "Option::is_none")]
248    pub sticker_set_name: Option<String>,
249    #[serde(skip_serializing_if = "Option::is_none")]
251    pub can_set_sticker_set: Option<bool>,
252    #[serde(skip_serializing_if = "Option::is_none")]
254    pub linked_chat_id: Option<i64>,
255    #[serde(skip_serializing_if = "Option::is_none")]
257    pub location: Option<ChatLocation>,
258}
259impl Chat {
260    pub fn new(id: i64, type_name: ChatType) -> Self {
261        Self {
262            id,
263            type_name,
264            title: None,
265            username: None,
266            first_name: None,
267            last_name: None,
268            photo: None,
269            bio: None,
270            has_private_forwards: None,
271            has_restricted_voice_and_video_messages: None,
272            join_to_send_messages: None,
273            join_by_request: None,
274            description: None,
275            invite_link: None,
276            pinned_message: None,
277            permissions: None,
278            slow_mode_delay: None,
279            message_auto_delete_time: None,
280            has_protected_content: None,
281            sticker_set_name: None,
282            can_set_sticker_set: None,
283            linked_chat_id: None,
284            location: None,
285        }
286    }
287}
288
289#[derive(Deserialize, Serialize, Debug, Clone)]
291pub struct Message {
292    pub message_id: i64,
294    #[serde(skip_serializing_if = "Option::is_none")]
296    pub from: Option<User>,
297    #[serde(skip_serializing_if = "Option::is_none")]
299    pub sender_chat: Option<Box<Chat>>,
300    pub date: i64,
302    pub chat: Box<Chat>,
304    #[serde(skip_serializing_if = "Option::is_none")]
306    pub forward_from: Option<User>,
307    #[serde(skip_serializing_if = "Option::is_none")]
309    pub forward_from_chat: Option<Box<Chat>>,
310    #[serde(skip_serializing_if = "Option::is_none")]
312    pub forward_from_message_id: Option<i64>,
313    #[serde(skip_serializing_if = "Option::is_none")]
315    pub forward_signature: Option<String>,
316    #[serde(skip_serializing_if = "Option::is_none")]
318    pub forward_sender_name: Option<String>,
319    #[serde(skip_serializing_if = "Option::is_none")]
321    pub forward_date: Option<i64>,
322    #[serde(skip_serializing_if = "Option::is_none")]
324    pub is_automatic_forward: Option<bool>,
325    #[serde(skip_serializing_if = "Option::is_none")]
327    pub reply_to_message: Option<Box<Message>>,
328    #[serde(skip_serializing_if = "Option::is_none")]
330    pub via_bot: Option<User>,
331    #[serde(skip_serializing_if = "Option::is_none")]
333    pub edit_date: Option<i64>,
334    #[serde(skip_serializing_if = "Option::is_none")]
336    pub has_protected_content: Option<bool>,
337    #[serde(skip_serializing_if = "Option::is_none")]
339    pub media_group_id: Option<String>,
340    #[serde(skip_serializing_if = "Option::is_none")]
342    pub author_signature: Option<String>,
343    #[serde(skip_serializing_if = "Option::is_none")]
345    pub text: Option<String>,
346    #[serde(skip_serializing_if = "Option::is_none")]
348    pub entities: Option<Vec<MessageEntity>>,
349    #[serde(skip_serializing_if = "Option::is_none")]
351    pub animation: Option<Animation>,
352    #[serde(skip_serializing_if = "Option::is_none")]
354    pub audio: Option<Audio>,
355    #[serde(skip_serializing_if = "Option::is_none")]
357    pub document: Option<Document>,
358    #[serde(skip_serializing_if = "Option::is_none")]
360    pub photo: Option<Vec<PhotoSize>>,
361    #[serde(skip_serializing_if = "Option::is_none")]
363    pub sticker: Option<Sticker>,
364    #[serde(skip_serializing_if = "Option::is_none")]
366    pub video: Option<Video>,
367    #[serde(skip_serializing_if = "Option::is_none")]
369    pub video_note: Option<VideoNote>,
370    #[serde(skip_serializing_if = "Option::is_none")]
372    pub voice: Option<Voice>,
373    #[serde(skip_serializing_if = "Option::is_none")]
375    pub caption: Option<String>,
376    #[serde(skip_serializing_if = "Option::is_none")]
378    pub caption_entities: Option<Vec<MessageEntity>>,
379    #[serde(skip_serializing_if = "Option::is_none")]
381    pub contact: Option<Contact>,
382    #[serde(skip_serializing_if = "Option::is_none")]
384    pub dice: Option<Dice>,
385    #[serde(skip_serializing_if = "Option::is_none")]
387    pub game: Option<Game>,
388    #[serde(skip_serializing_if = "Option::is_none")]
390    pub poll: Option<Poll>,
391    #[serde(skip_serializing_if = "Option::is_none")]
393    pub venue: Option<Venue>,
394    #[serde(skip_serializing_if = "Option::is_none")]
396    pub location: Option<Location>,
397    #[serde(skip_serializing_if = "Option::is_none")]
399    pub new_chat_members: Option<Vec<User>>,
400    #[serde(skip_serializing_if = "Option::is_none")]
402    pub left_chat_member: Option<User>,
403    #[serde(skip_serializing_if = "Option::is_none")]
405    pub new_chat_title: Option<String>,
406    #[serde(skip_serializing_if = "Option::is_none")]
408    pub new_chat_photo: Option<Vec<PhotoSize>>,
409    #[serde(skip_serializing_if = "Option::is_none")]
411    pub delete_chat_photo: Option<bool>,
412    #[serde(skip_serializing_if = "Option::is_none")]
414    pub group_chat_created: Option<bool>,
415    #[serde(skip_serializing_if = "Option::is_none")]
417    pub supergroup_chat_created: Option<bool>,
418    #[serde(skip_serializing_if = "Option::is_none")]
420    pub channel_chat_created: Option<bool>,
421    #[serde(skip_serializing_if = "Option::is_none")]
423    pub message_auto_delete_timer_changed: Option<MessageAutoDeleteTimerChanged>,
424    #[serde(skip_serializing_if = "Option::is_none")]
426    pub migrate_to_chat_id: Option<i64>,
427    #[serde(skip_serializing_if = "Option::is_none")]
429    pub migrate_from_chat_id: Option<i64>,
430    #[serde(skip_serializing_if = "Option::is_none")]
432    pub pinned_message: Option<Box<Message>>,
433    #[serde(skip_serializing_if = "Option::is_none")]
435    pub invoice: Option<Invoice>,
436    #[serde(skip_serializing_if = "Option::is_none")]
438    pub successful_payment: Option<SuccessfulPayment>,
439    #[serde(skip_serializing_if = "Option::is_none")]
441    pub connected_website: Option<String>,
442    #[serde(skip_serializing_if = "Option::is_none")]
444    pub passport_data: Option<PassportData>,
445    #[serde(skip_serializing_if = "Option::is_none")]
447    pub proximity_alert_triggered: Option<ProximityAlertTriggered>,
448    #[serde(skip_serializing_if = "Option::is_none")]
450    pub video_chat_scheduled: Option<VideoChatScheduled>,
451    #[serde(skip_serializing_if = "Option::is_none")]
453    pub video_chat_started: Option<VideoChatStarted>,
454    #[serde(skip_serializing_if = "Option::is_none")]
456    pub video_chat_ended: Option<VideoChatEnded>,
457    #[serde(skip_serializing_if = "Option::is_none")]
459    pub video_chat_participants_invited: Option<VideoChatParticipantsInvited>,
460    #[serde(skip_serializing_if = "Option::is_none")]
462    pub web_app_data: Option<WebAppData>,
463    #[serde(skip_serializing_if = "Option::is_none")]
465    pub reply_markup: Option<InlineKeyboardMarkup>,
466}
467impl Message {
468    pub fn new(message_id: i64, date: i64, chat: Box<Chat>) -> Self {
469        Self {
470            message_id,
471            from: None,
472            sender_chat: None,
473            date,
474            chat,
475            forward_from: None,
476            forward_from_chat: None,
477            forward_from_message_id: None,
478            forward_signature: None,
479            forward_sender_name: None,
480            forward_date: None,
481            is_automatic_forward: None,
482            reply_to_message: None,
483            via_bot: None,
484            edit_date: None,
485            has_protected_content: None,
486            media_group_id: None,
487            author_signature: None,
488            text: None,
489            entities: None,
490            animation: None,
491            audio: None,
492            document: None,
493            photo: None,
494            sticker: None,
495            video: None,
496            video_note: None,
497            voice: None,
498            caption: None,
499            caption_entities: None,
500            contact: None,
501            dice: None,
502            game: None,
503            poll: None,
504            venue: None,
505            location: None,
506            new_chat_members: None,
507            left_chat_member: None,
508            new_chat_title: None,
509            new_chat_photo: None,
510            delete_chat_photo: None,
511            group_chat_created: None,
512            supergroup_chat_created: None,
513            channel_chat_created: None,
514            message_auto_delete_timer_changed: None,
515            migrate_to_chat_id: None,
516            migrate_from_chat_id: None,
517            pinned_message: None,
518            invoice: None,
519            successful_payment: None,
520            connected_website: None,
521            passport_data: None,
522            proximity_alert_triggered: None,
523            video_chat_scheduled: None,
524            video_chat_started: None,
525            video_chat_ended: None,
526            video_chat_participants_invited: None,
527            web_app_data: None,
528            reply_markup: None,
529        }
530    }
531}
532
533#[derive(Deserialize, Serialize, Debug, Clone)]
535pub struct MessageId {
536    pub message_id: i64,
538}
539impl MessageId {
540    pub fn new(message_id: i64) -> Self {
541        Self { message_id }
542    }
543}
544
545#[derive(Deserialize, Serialize, Debug, Clone)]
547pub struct MessageEntity {
548    #[serde(rename = "type")]
550    pub type_name: String,
551    pub offset: i64,
553    pub length: i64,
555    #[serde(skip_serializing_if = "Option::is_none")]
557    pub url: Option<String>,
558    #[serde(skip_serializing_if = "Option::is_none")]
560    pub user: Option<User>,
561    #[serde(skip_serializing_if = "Option::is_none")]
563    pub language: Option<String>,
564    #[serde(skip_serializing_if = "Option::is_none")]
566    pub custom_emoji_id: Option<String>,
567}
568impl MessageEntity {
569    pub fn new(type_name: String, offset: i64, length: i64) -> Self {
570        Self {
571            type_name,
572            offset,
573            length,
574            url: None,
575            user: None,
576            language: None,
577            custom_emoji_id: None,
578        }
579    }
580}
581
582#[derive(Deserialize, Serialize, Debug, Clone)]
584pub struct PhotoSize {
585    pub file_id: String,
587    pub file_unique_id: String,
589    pub width: i64,
591    pub height: i64,
593    #[serde(skip_serializing_if = "Option::is_none")]
595    pub file_size: Option<i64>,
596}
597impl PhotoSize {
598    pub fn new(file_id: String, file_unique_id: String, width: i64, height: i64) -> Self {
599        Self {
600            file_id,
601            file_unique_id,
602            width,
603            height,
604            file_size: None,
605        }
606    }
607}
608
609#[derive(Deserialize, Serialize, Debug, Clone)]
611pub struct Animation {
612    pub file_id: String,
614    pub file_unique_id: String,
616    pub width: i64,
618    pub height: i64,
620    pub duration: i64,
622    #[serde(skip_serializing_if = "Option::is_none")]
624    pub thumb: Option<PhotoSize>,
625    #[serde(skip_serializing_if = "Option::is_none")]
627    pub file_name: Option<String>,
628    #[serde(skip_serializing_if = "Option::is_none")]
630    pub mime_type: Option<String>,
631    #[serde(skip_serializing_if = "Option::is_none")]
633    pub file_size: Option<i64>,
634}
635impl Animation {
636    pub fn new(
637        file_id: String,
638        file_unique_id: String,
639        width: i64,
640        height: i64,
641        duration: i64,
642    ) -> Self {
643        Self {
644            file_id,
645            file_unique_id,
646            width,
647            height,
648            duration,
649            thumb: None,
650            file_name: None,
651            mime_type: None,
652            file_size: None,
653        }
654    }
655}
656
657#[derive(Deserialize, Serialize, Debug, Clone)]
659pub struct Audio {
660    pub file_id: String,
662    pub file_unique_id: String,
664    pub duration: i64,
666    #[serde(skip_serializing_if = "Option::is_none")]
668    pub performer: Option<String>,
669    #[serde(skip_serializing_if = "Option::is_none")]
671    pub title: Option<String>,
672    #[serde(skip_serializing_if = "Option::is_none")]
674    pub file_name: Option<String>,
675    #[serde(skip_serializing_if = "Option::is_none")]
677    pub mime_type: Option<String>,
678    #[serde(skip_serializing_if = "Option::is_none")]
680    pub file_size: Option<i64>,
681    #[serde(skip_serializing_if = "Option::is_none")]
683    pub thumb: Option<PhotoSize>,
684}
685impl Audio {
686    pub fn new(file_id: String, file_unique_id: String, duration: i64) -> Self {
687        Self {
688            file_id,
689            file_unique_id,
690            duration,
691            performer: None,
692            title: None,
693            file_name: None,
694            mime_type: None,
695            file_size: None,
696            thumb: None,
697        }
698    }
699}
700
701#[derive(Deserialize, Serialize, Debug, Clone)]
703pub struct Document {
704    pub file_id: String,
706    pub file_unique_id: String,
708    #[serde(skip_serializing_if = "Option::is_none")]
710    pub thumb: Option<PhotoSize>,
711    #[serde(skip_serializing_if = "Option::is_none")]
713    pub file_name: Option<String>,
714    #[serde(skip_serializing_if = "Option::is_none")]
716    pub mime_type: Option<String>,
717    #[serde(skip_serializing_if = "Option::is_none")]
719    pub file_size: Option<i64>,
720}
721impl Document {
722    pub fn new(file_id: String, file_unique_id: String) -> Self {
723        Self {
724            file_id,
725            file_unique_id,
726            thumb: None,
727            file_name: None,
728            mime_type: None,
729            file_size: None,
730        }
731    }
732}
733
734#[derive(Deserialize, Serialize, Debug, Clone)]
736pub struct Video {
737    pub file_id: String,
739    pub file_unique_id: String,
741    pub width: i64,
743    pub height: i64,
745    pub duration: i64,
747    #[serde(skip_serializing_if = "Option::is_none")]
749    pub thumb: Option<PhotoSize>,
750    #[serde(skip_serializing_if = "Option::is_none")]
752    pub file_name: Option<String>,
753    #[serde(skip_serializing_if = "Option::is_none")]
755    pub mime_type: Option<String>,
756    #[serde(skip_serializing_if = "Option::is_none")]
758    pub file_size: Option<i64>,
759}
760impl Video {
761    pub fn new(
762        file_id: String,
763        file_unique_id: String,
764        width: i64,
765        height: i64,
766        duration: i64,
767    ) -> Self {
768        Self {
769            file_id,
770            file_unique_id,
771            width,
772            height,
773            duration,
774            thumb: None,
775            file_name: None,
776            mime_type: None,
777            file_size: None,
778        }
779    }
780}
781
782#[derive(Deserialize, Serialize, Debug, Clone)]
784pub struct VideoNote {
785    pub file_id: String,
787    pub file_unique_id: String,
789    pub length: i64,
791    pub duration: i64,
793    #[serde(skip_serializing_if = "Option::is_none")]
795    pub thumb: Option<PhotoSize>,
796    #[serde(skip_serializing_if = "Option::is_none")]
798    pub file_size: Option<i64>,
799}
800impl VideoNote {
801    pub fn new(file_id: String, file_unique_id: String, length: i64, duration: i64) -> Self {
802        Self {
803            file_id,
804            file_unique_id,
805            length,
806            duration,
807            thumb: None,
808            file_size: None,
809        }
810    }
811}
812
813#[derive(Deserialize, Serialize, Debug, Clone)]
815pub struct Voice {
816    pub file_id: String,
818    pub file_unique_id: String,
820    pub duration: i64,
822    #[serde(skip_serializing_if = "Option::is_none")]
824    pub mime_type: Option<String>,
825    #[serde(skip_serializing_if = "Option::is_none")]
827    pub file_size: Option<i64>,
828}
829impl Voice {
830    pub fn new(file_id: String, file_unique_id: String, duration: i64) -> Self {
831        Self {
832            file_id,
833            file_unique_id,
834            duration,
835            mime_type: None,
836            file_size: None,
837        }
838    }
839}
840
841#[derive(Deserialize, Serialize, Debug, Clone)]
843pub struct Contact {
844    pub phone_number: String,
846    pub first_name: String,
848    #[serde(skip_serializing_if = "Option::is_none")]
850    pub last_name: Option<String>,
851    #[serde(skip_serializing_if = "Option::is_none")]
853    pub user_id: Option<i64>,
854    #[serde(skip_serializing_if = "Option::is_none")]
856    pub vcard: Option<String>,
857}
858impl Contact {
859    pub fn new(phone_number: String, first_name: String) -> Self {
860        Self {
861            phone_number,
862            first_name,
863            last_name: None,
864            user_id: None,
865            vcard: None,
866        }
867    }
868}
869
870#[derive(Deserialize, Serialize, Debug, Clone)]
872pub struct Dice {
873    pub emoji: String,
875    pub value: i64,
877}
878impl Dice {
879    pub fn new(emoji: String, value: i64) -> Self {
880        Self { emoji, value }
881    }
882}
883
884#[derive(Deserialize, Serialize, Debug, Clone)]
886pub struct PollOption {
887    pub text: String,
889    pub voter_count: i64,
891}
892impl PollOption {
893    pub fn new(text: String, voter_count: i64) -> Self {
894        Self { text, voter_count }
895    }
896}
897
898#[derive(Deserialize, Serialize, Debug, Clone)]
900pub struct PollAnswer {
901    pub poll_id: String,
903    pub user: User,
905    pub option_ids: Vec<i64>,
907}
908impl PollAnswer {
909    pub fn new(poll_id: String, user: User, option_ids: Vec<i64>) -> Self {
910        Self {
911            poll_id,
912            user,
913            option_ids,
914        }
915    }
916}
917
918#[derive(Deserialize, Serialize, Debug, Clone)]
920pub struct Poll {
921    pub id: String,
923    pub question: String,
925    pub options: Vec<PollOption>,
927    pub total_voter_count: i64,
929    pub is_closed: bool,
931    pub is_anonymous: bool,
933    #[serde(rename = "type")]
935    pub type_name: String,
936    pub allows_multiple_answers: bool,
938    #[serde(skip_serializing_if = "Option::is_none")]
940    pub correct_option_id: Option<i64>,
941    #[serde(skip_serializing_if = "Option::is_none")]
943    pub explanation: Option<String>,
944    #[serde(skip_serializing_if = "Option::is_none")]
946    pub explanation_entities: Option<Vec<MessageEntity>>,
947    #[serde(skip_serializing_if = "Option::is_none")]
949    pub open_period: Option<i64>,
950    #[serde(skip_serializing_if = "Option::is_none")]
952    pub close_date: Option<i64>,
953}
954impl Poll {
955    pub fn new(
956        id: String,
957        question: String,
958        options: Vec<PollOption>,
959        total_voter_count: i64,
960        is_closed: bool,
961        is_anonymous: bool,
962        type_name: String,
963        allows_multiple_answers: bool,
964    ) -> Self {
965        Self {
966            id,
967            question,
968            options,
969            total_voter_count,
970            is_closed,
971            is_anonymous,
972            type_name,
973            allows_multiple_answers,
974            correct_option_id: None,
975            explanation: None,
976            explanation_entities: None,
977            open_period: None,
978            close_date: None,
979        }
980    }
981}
982
983#[derive(Deserialize, Serialize, Debug, Clone)]
985pub struct Location {
986    pub longitude: f64,
988    pub latitude: f64,
990    #[serde(skip_serializing_if = "Option::is_none")]
992    pub horizontal_accuracy: Option<f64>,
993    #[serde(skip_serializing_if = "Option::is_none")]
995    pub live_period: Option<i64>,
996    #[serde(skip_serializing_if = "Option::is_none")]
998    pub heading: Option<i64>,
999    #[serde(skip_serializing_if = "Option::is_none")]
1001    pub proximity_alert_radius: Option<i64>,
1002}
1003impl Location {
1004    pub fn new(longitude: f64, latitude: f64) -> Self {
1005        Self {
1006            longitude,
1007            latitude,
1008            horizontal_accuracy: None,
1009            live_period: None,
1010            heading: None,
1011            proximity_alert_radius: None,
1012        }
1013    }
1014}
1015
1016#[derive(Deserialize, Serialize, Debug, Clone)]
1018pub struct Venue {
1019    pub location: Location,
1021    pub title: String,
1023    pub address: String,
1025    #[serde(skip_serializing_if = "Option::is_none")]
1027    pub foursquare_id: Option<String>,
1028    #[serde(skip_serializing_if = "Option::is_none")]
1030    pub foursquare_type: Option<String>,
1031    #[serde(skip_serializing_if = "Option::is_none")]
1033    pub google_place_id: Option<String>,
1034    #[serde(skip_serializing_if = "Option::is_none")]
1036    pub google_place_type: Option<String>,
1037}
1038impl Venue {
1039    pub fn new(location: Location, title: String, address: String) -> Self {
1040        Self {
1041            location,
1042            title,
1043            address,
1044            foursquare_id: None,
1045            foursquare_type: None,
1046            google_place_id: None,
1047            google_place_type: None,
1048        }
1049    }
1050}
1051
1052#[derive(Deserialize, Serialize, Debug, Clone)]
1054pub struct WebAppData {
1055    pub data: String,
1057    pub button_text: String,
1059}
1060impl WebAppData {
1061    pub fn new(data: String, button_text: String) -> Self {
1062        Self { data, button_text }
1063    }
1064}
1065
1066#[derive(Deserialize, Serialize, Debug, Clone)]
1068pub struct ProximityAlertTriggered {
1069    pub traveler: User,
1071    pub watcher: User,
1073    pub distance: i64,
1075}
1076impl ProximityAlertTriggered {
1077    pub fn new(traveler: User, watcher: User, distance: i64) -> Self {
1078        Self {
1079            traveler,
1080            watcher,
1081            distance,
1082        }
1083    }
1084}
1085
1086#[derive(Deserialize, Serialize, Debug, Clone)]
1088pub struct MessageAutoDeleteTimerChanged {
1089    pub message_auto_delete_time: i64,
1091}
1092impl MessageAutoDeleteTimerChanged {
1093    pub fn new(message_auto_delete_time: i64) -> Self {
1094        Self {
1095            message_auto_delete_time,
1096        }
1097    }
1098}
1099
1100#[derive(Deserialize, Serialize, Debug, Clone)]
1102pub struct VideoChatScheduled {
1103    pub start_date: i64,
1105}
1106impl VideoChatScheduled {
1107    pub fn new(start_date: i64) -> Self {
1108        Self { start_date }
1109    }
1110}
1111
1112#[derive(Deserialize, Serialize, Debug, Clone)]
1114pub struct VideoChatStarted {}
1115impl VideoChatStarted {
1116    pub fn new() -> Self {
1117        Self {}
1118    }
1119}
1120
1121#[derive(Deserialize, Serialize, Debug, Clone)]
1123pub struct VideoChatEnded {
1124    pub duration: i64,
1126}
1127impl VideoChatEnded {
1128    pub fn new(duration: i64) -> Self {
1129        Self { duration }
1130    }
1131}
1132
1133#[derive(Deserialize, Serialize, Debug, Clone)]
1135pub struct VideoChatParticipantsInvited {
1136    pub users: Vec<User>,
1138}
1139impl VideoChatParticipantsInvited {
1140    pub fn new(users: Vec<User>) -> Self {
1141        Self { users }
1142    }
1143}
1144
1145#[derive(Deserialize, Serialize, Debug, Clone)]
1147pub struct UserProfilePhotos {
1148    pub total_count: i64,
1150    pub photos: Vec<Vec<PhotoSize>>,
1152}
1153impl UserProfilePhotos {
1154    pub fn new(total_count: i64, photos: Vec<Vec<PhotoSize>>) -> Self {
1155        Self {
1156            total_count,
1157            photos,
1158        }
1159    }
1160}
1161
1162#[derive(Deserialize, Serialize, Debug, Clone)]
1164pub struct File {
1165    pub file_id: String,
1167    pub file_unique_id: String,
1169    #[serde(skip_serializing_if = "Option::is_none")]
1171    pub file_size: Option<i64>,
1172    #[serde(skip_serializing_if = "Option::is_none")]
1174    pub file_path: Option<String>,
1175}
1176impl File {
1177    pub fn new(file_id: String, file_unique_id: String) -> Self {
1178        Self {
1179            file_id,
1180            file_unique_id,
1181            file_size: None,
1182            file_path: None,
1183        }
1184    }
1185}
1186
1187#[derive(Deserialize, Serialize, Debug, Clone)]
1189pub struct WebAppInfo {
1190    pub url: String,
1192}
1193impl WebAppInfo {
1194    pub fn new(url: String) -> Self {
1195        Self { url }
1196    }
1197}
1198
1199#[derive(Deserialize, Serialize, Debug, Clone)]
1201pub struct ReplyKeyboardMarkup {
1202    pub keyboard: Vec<Vec<KeyboardButton>>,
1204    #[serde(skip_serializing_if = "Option::is_none")]
1206    pub resize_keyboard: Option<bool>,
1207    #[serde(skip_serializing_if = "Option::is_none")]
1209    pub one_time_keyboard: Option<bool>,
1210    #[serde(skip_serializing_if = "Option::is_none")]
1212    pub input_field_placeholder: Option<String>,
1213    #[serde(skip_serializing_if = "Option::is_none")]
1215    pub selective: Option<bool>,
1216}
1217impl ReplyKeyboardMarkup {
1218    pub fn new(keyboard: Vec<Vec<KeyboardButton>>) -> Self {
1219        Self {
1220            keyboard,
1221            resize_keyboard: None,
1222            one_time_keyboard: None,
1223            input_field_placeholder: None,
1224            selective: None,
1225        }
1226    }
1227}
1228
1229#[derive(Deserialize, Serialize, Debug, Clone)]
1231pub struct KeyboardButton {
1232    pub text: String,
1234    #[serde(skip_serializing_if = "Option::is_none")]
1236    pub request_contact: Option<bool>,
1237    #[serde(skip_serializing_if = "Option::is_none")]
1239    pub request_location: Option<bool>,
1240    #[serde(skip_serializing_if = "Option::is_none")]
1242    pub request_poll: Option<KeyboardButtonPollType>,
1243    #[serde(skip_serializing_if = "Option::is_none")]
1245    pub web_app: Option<WebAppInfo>,
1246}
1247impl KeyboardButton {
1248    pub fn new(text: String) -> Self {
1249        Self {
1250            text,
1251            request_contact: None,
1252            request_location: None,
1253            request_poll: None,
1254            web_app: None,
1255        }
1256    }
1257}
1258
1259#[derive(Deserialize, Serialize, Debug, Clone)]
1261pub struct KeyboardButtonPollType {
1262    #[serde(skip_serializing_if = "Option::is_none", rename = "type")]
1264    pub type_name: Option<String>,
1265}
1266impl KeyboardButtonPollType {
1267    pub fn new() -> Self {
1268        Self { type_name: None }
1269    }
1270}
1271
1272#[derive(Deserialize, Serialize, Debug, Clone)]
1274pub struct ReplyKeyboardRemove {
1275    pub remove_keyboard: bool,
1277    #[serde(skip_serializing_if = "Option::is_none")]
1279    pub selective: Option<bool>,
1280}
1281impl ReplyKeyboardRemove {
1282    pub fn new(remove_keyboard: bool) -> Self {
1283        Self {
1284            remove_keyboard,
1285            selective: None,
1286        }
1287    }
1288}
1289
1290#[derive(Deserialize, Serialize, Debug, Clone)]
1292pub struct InlineKeyboardMarkup {
1293    pub inline_keyboard: Vec<Vec<InlineKeyboardButton>>,
1295}
1296impl InlineKeyboardMarkup {
1297    pub fn new(inline_keyboard: Vec<Vec<InlineKeyboardButton>>) -> Self {
1298        Self { inline_keyboard }
1299    }
1300}
1301
1302#[derive(Deserialize, Serialize, Debug, Clone)]
1304pub struct InlineKeyboardButton {
1305    pub text: String,
1307    #[serde(skip_serializing_if = "Option::is_none")]
1309    pub url: Option<String>,
1310    #[serde(skip_serializing_if = "Option::is_none")]
1312    pub callback_data: Option<String>,
1313    #[serde(skip_serializing_if = "Option::is_none")]
1315    pub web_app: Option<WebAppInfo>,
1316    #[serde(skip_serializing_if = "Option::is_none")]
1318    pub login_url: Option<LoginUrl>,
1319    #[serde(skip_serializing_if = "Option::is_none")]
1321    pub switch_inline_query: Option<String>,
1322    #[serde(skip_serializing_if = "Option::is_none")]
1324    pub switch_inline_query_current_chat: Option<String>,
1325    #[serde(skip_serializing_if = "Option::is_none")]
1327    pub callback_game: Option<CallbackGame>,
1328    #[serde(skip_serializing_if = "Option::is_none")]
1330    pub pay: Option<bool>,
1331}
1332impl InlineKeyboardButton {
1333    pub fn new(text: String) -> Self {
1334        Self {
1335            text,
1336            url: None,
1337            callback_data: None,
1338            web_app: None,
1339            login_url: None,
1340            switch_inline_query: None,
1341            switch_inline_query_current_chat: None,
1342            callback_game: None,
1343            pay: None,
1344        }
1345    }
1346}
1347
1348#[derive(Deserialize, Serialize, Debug, Clone)]
1350pub struct LoginUrl {
1351    pub url: String,
1353    #[serde(skip_serializing_if = "Option::is_none")]
1355    pub forward_text: Option<String>,
1356    #[serde(skip_serializing_if = "Option::is_none")]
1358    pub bot_username: Option<String>,
1359    #[serde(skip_serializing_if = "Option::is_none")]
1361    pub request_write_access: Option<bool>,
1362}
1363impl LoginUrl {
1364    pub fn new(url: String) -> Self {
1365        Self {
1366            url,
1367            forward_text: None,
1368            bot_username: None,
1369            request_write_access: None,
1370        }
1371    }
1372}
1373
1374#[derive(Deserialize, Serialize, Debug, Clone)]
1376pub struct CallbackQuery {
1377    pub id: String,
1379    pub from: User,
1381    #[serde(skip_serializing_if = "Option::is_none")]
1383    pub message: Option<Message>,
1384    #[serde(skip_serializing_if = "Option::is_none")]
1386    pub inline_message_id: Option<String>,
1387    pub chat_instance: String,
1389    #[serde(skip_serializing_if = "Option::is_none")]
1391    pub data: Option<String>,
1392    #[serde(skip_serializing_if = "Option::is_none")]
1394    pub game_short_name: Option<String>,
1395}
1396impl CallbackQuery {
1397    pub fn new(id: String, from: User, chat_instance: String) -> Self {
1398        Self {
1399            id,
1400            from,
1401            message: None,
1402            inline_message_id: None,
1403            chat_instance,
1404            data: None,
1405            game_short_name: None,
1406        }
1407    }
1408}
1409
1410#[derive(Deserialize, Serialize, Debug, Clone)]
1412pub struct ForceReply {
1413    pub force_reply: bool,
1415    #[serde(skip_serializing_if = "Option::is_none")]
1417    pub input_field_placeholder: Option<String>,
1418    #[serde(skip_serializing_if = "Option::is_none")]
1420    pub selective: Option<bool>,
1421}
1422impl ForceReply {
1423    pub fn new(force_reply: bool) -> Self {
1424        Self {
1425            force_reply,
1426            input_field_placeholder: None,
1427            selective: None,
1428        }
1429    }
1430}
1431
1432#[derive(Deserialize, Serialize, Debug, Clone)]
1434pub struct ChatPhoto {
1435    pub small_file_id: String,
1437    pub small_file_unique_id: String,
1439    pub big_file_id: String,
1441    pub big_file_unique_id: String,
1443}
1444impl ChatPhoto {
1445    pub fn new(
1446        small_file_id: String,
1447        small_file_unique_id: String,
1448        big_file_id: String,
1449        big_file_unique_id: String,
1450    ) -> Self {
1451        Self {
1452            small_file_id,
1453            small_file_unique_id,
1454            big_file_id,
1455            big_file_unique_id,
1456        }
1457    }
1458}
1459
1460#[derive(Deserialize, Serialize, Debug, Clone)]
1462pub struct ChatInviteLink {
1463    pub invite_link: String,
1465    pub creator: User,
1467    pub creates_join_request: bool,
1469    pub is_primary: bool,
1471    pub is_revoked: bool,
1473    #[serde(skip_serializing_if = "Option::is_none")]
1475    pub name: Option<String>,
1476    #[serde(skip_serializing_if = "Option::is_none")]
1478    pub expire_date: Option<i64>,
1479    #[serde(skip_serializing_if = "Option::is_none")]
1481    pub member_limit: Option<i64>,
1482    #[serde(skip_serializing_if = "Option::is_none")]
1484    pub pending_join_request_count: Option<i64>,
1485}
1486impl ChatInviteLink {
1487    pub fn new(
1488        invite_link: String,
1489        creator: User,
1490        creates_join_request: bool,
1491        is_primary: bool,
1492        is_revoked: bool,
1493    ) -> Self {
1494        Self {
1495            invite_link,
1496            creator,
1497            creates_join_request,
1498            is_primary,
1499            is_revoked,
1500            name: None,
1501            expire_date: None,
1502            member_limit: None,
1503            pending_join_request_count: None,
1504        }
1505    }
1506}
1507
1508#[derive(Deserialize, Serialize, Debug, Clone)]
1510pub struct ChatAdministratorRights {
1511    pub is_anonymous: bool,
1513    pub can_manage_chat: bool,
1515    pub can_delete_messages: bool,
1517    pub can_manage_video_chats: bool,
1519    pub can_restrict_members: bool,
1521    pub can_promote_members: bool,
1523    pub can_change_info: bool,
1525    pub can_invite_users: bool,
1527    #[serde(skip_serializing_if = "Option::is_none")]
1529    pub can_post_messages: Option<bool>,
1530    #[serde(skip_serializing_if = "Option::is_none")]
1532    pub can_edit_messages: Option<bool>,
1533    #[serde(skip_serializing_if = "Option::is_none")]
1535    pub can_pin_messages: Option<bool>,
1536}
1537impl ChatAdministratorRights {
1538    pub fn new(
1539        is_anonymous: bool,
1540        can_manage_chat: bool,
1541        can_delete_messages: bool,
1542        can_manage_video_chats: bool,
1543        can_restrict_members: bool,
1544        can_promote_members: bool,
1545        can_change_info: bool,
1546        can_invite_users: bool,
1547    ) -> Self {
1548        Self {
1549            is_anonymous,
1550            can_manage_chat,
1551            can_delete_messages,
1552            can_manage_video_chats,
1553            can_restrict_members,
1554            can_promote_members,
1555            can_change_info,
1556            can_invite_users,
1557            can_post_messages: None,
1558            can_edit_messages: None,
1559            can_pin_messages: None,
1560        }
1561    }
1562}
1563
1564#[derive(Deserialize, Serialize, Debug, Clone)]
1566pub struct ChatMemberOwner {
1567    pub user: User,
1569    pub is_anonymous: bool,
1571    #[serde(skip_serializing_if = "Option::is_none")]
1573    pub custom_title: Option<String>,
1574}
1575impl ChatMemberOwner {
1576    pub fn new(user: User, is_anonymous: bool) -> Self {
1577        Self {
1578            user,
1579            is_anonymous,
1580            custom_title: None,
1581        }
1582    }
1583}
1584
1585#[derive(Deserialize, Serialize, Debug, Clone)]
1587pub struct ChatMemberAdministrator {
1588    pub user: User,
1590    pub can_be_edited: bool,
1592    pub is_anonymous: bool,
1594    pub can_manage_chat: bool,
1596    pub can_delete_messages: bool,
1598    pub can_manage_video_chats: bool,
1600    pub can_restrict_members: bool,
1602    pub can_promote_members: bool,
1604    pub can_change_info: bool,
1606    pub can_invite_users: bool,
1608    #[serde(skip_serializing_if = "Option::is_none")]
1610    pub can_post_messages: Option<bool>,
1611    #[serde(skip_serializing_if = "Option::is_none")]
1613    pub can_edit_messages: Option<bool>,
1614    #[serde(skip_serializing_if = "Option::is_none")]
1616    pub can_pin_messages: Option<bool>,
1617    #[serde(skip_serializing_if = "Option::is_none")]
1619    pub custom_title: Option<String>,
1620}
1621impl ChatMemberAdministrator {
1622    pub fn new(
1623        user: User,
1624        can_be_edited: bool,
1625        is_anonymous: bool,
1626        can_manage_chat: bool,
1627        can_delete_messages: bool,
1628        can_manage_video_chats: bool,
1629        can_restrict_members: bool,
1630        can_promote_members: bool,
1631        can_change_info: bool,
1632        can_invite_users: bool,
1633    ) -> Self {
1634        Self {
1635            user,
1636            can_be_edited,
1637            is_anonymous,
1638            can_manage_chat,
1639            can_delete_messages,
1640            can_manage_video_chats,
1641            can_restrict_members,
1642            can_promote_members,
1643            can_change_info,
1644            can_invite_users,
1645            can_post_messages: None,
1646            can_edit_messages: None,
1647            can_pin_messages: None,
1648            custom_title: None,
1649        }
1650    }
1651}
1652
1653#[derive(Deserialize, Serialize, Debug, Clone)]
1655pub struct ChatMemberMember {
1656    pub user: User,
1658}
1659impl ChatMemberMember {
1660    pub fn new(user: User) -> Self {
1661        Self { user }
1662    }
1663}
1664
1665#[derive(Deserialize, Serialize, Debug, Clone)]
1667pub struct ChatMemberRestricted {
1668    pub user: User,
1670    pub is_member: bool,
1672    pub can_change_info: bool,
1674    pub can_invite_users: bool,
1676    pub can_pin_messages: bool,
1678    pub can_send_messages: bool,
1680    pub can_send_media_messages: bool,
1682    pub can_send_polls: bool,
1684    pub can_send_other_messages: bool,
1686    pub can_add_web_page_previews: bool,
1688    pub until_date: i64,
1690}
1691impl ChatMemberRestricted {
1692    pub fn new(
1693        user: User,
1694        is_member: bool,
1695        can_change_info: bool,
1696        can_invite_users: bool,
1697        can_pin_messages: bool,
1698        can_send_messages: bool,
1699        can_send_media_messages: bool,
1700        can_send_polls: bool,
1701        can_send_other_messages: bool,
1702        can_add_web_page_previews: bool,
1703        until_date: i64,
1704    ) -> Self {
1705        Self {
1706            user,
1707            is_member,
1708            can_change_info,
1709            can_invite_users,
1710            can_pin_messages,
1711            can_send_messages,
1712            can_send_media_messages,
1713            can_send_polls,
1714            can_send_other_messages,
1715            can_add_web_page_previews,
1716            until_date,
1717        }
1718    }
1719}
1720
1721#[derive(Deserialize, Serialize, Debug, Clone)]
1723pub struct ChatMemberLeft {
1724    pub user: User,
1726}
1727impl ChatMemberLeft {
1728    pub fn new(user: User) -> Self {
1729        Self { user }
1730    }
1731}
1732
1733#[derive(Deserialize, Serialize, Debug, Clone)]
1735pub struct ChatMemberBanned {
1736    pub user: User,
1738    pub until_date: i64,
1740}
1741impl ChatMemberBanned {
1742    pub fn new(user: User, until_date: i64) -> Self {
1743        Self { user, until_date }
1744    }
1745}
1746
1747#[derive(Deserialize, Serialize, Debug, Clone)]
1749pub struct ChatMemberUpdated {
1750    pub chat: Chat,
1752    pub from: User,
1754    pub date: i64,
1756    pub old_chat_member: ChatMember,
1758    pub new_chat_member: ChatMember,
1760    #[serde(skip_serializing_if = "Option::is_none")]
1762    pub invite_link: Option<ChatInviteLink>,
1763}
1764impl ChatMemberUpdated {
1765    pub fn new(
1766        chat: Chat,
1767        from: User,
1768        date: i64,
1769        old_chat_member: ChatMember,
1770        new_chat_member: ChatMember,
1771    ) -> Self {
1772        Self {
1773            chat,
1774            from,
1775            date,
1776            old_chat_member,
1777            new_chat_member,
1778            invite_link: None,
1779        }
1780    }
1781}
1782
1783#[derive(Deserialize, Serialize, Debug, Clone)]
1785pub struct ChatJoinRequest {
1786    pub chat: Chat,
1788    pub from: User,
1790    pub date: i64,
1792    #[serde(skip_serializing_if = "Option::is_none")]
1794    pub bio: Option<String>,
1795    #[serde(skip_serializing_if = "Option::is_none")]
1797    pub invite_link: Option<ChatInviteLink>,
1798}
1799impl ChatJoinRequest {
1800    pub fn new(chat: Chat, from: User, date: i64) -> Self {
1801        Self {
1802            chat,
1803            from,
1804            date,
1805            bio: None,
1806            invite_link: None,
1807        }
1808    }
1809}
1810
1811#[derive(Deserialize, Serialize, Debug, Clone)]
1813pub struct ChatPermissions {
1814    #[serde(skip_serializing_if = "Option::is_none")]
1816    pub can_send_messages: Option<bool>,
1817    #[serde(skip_serializing_if = "Option::is_none")]
1819    pub can_send_media_messages: Option<bool>,
1820    #[serde(skip_serializing_if = "Option::is_none")]
1822    pub can_send_polls: Option<bool>,
1823    #[serde(skip_serializing_if = "Option::is_none")]
1825    pub can_send_other_messages: Option<bool>,
1826    #[serde(skip_serializing_if = "Option::is_none")]
1828    pub can_add_web_page_previews: Option<bool>,
1829    #[serde(skip_serializing_if = "Option::is_none")]
1831    pub can_change_info: Option<bool>,
1832    #[serde(skip_serializing_if = "Option::is_none")]
1834    pub can_invite_users: Option<bool>,
1835    #[serde(skip_serializing_if = "Option::is_none")]
1837    pub can_pin_messages: Option<bool>,
1838}
1839impl ChatPermissions {
1840    pub fn new() -> Self {
1841        Self {
1842            can_send_messages: None,
1843            can_send_media_messages: None,
1844            can_send_polls: None,
1845            can_send_other_messages: None,
1846            can_add_web_page_previews: None,
1847            can_change_info: None,
1848            can_invite_users: None,
1849            can_pin_messages: None,
1850        }
1851    }
1852}
1853
1854#[derive(Deserialize, Serialize, Debug, Clone)]
1856pub struct ChatLocation {
1857    pub location: Location,
1859    pub address: String,
1861}
1862impl ChatLocation {
1863    pub fn new(location: Location, address: String) -> Self {
1864        Self { location, address }
1865    }
1866}
1867
1868#[derive(Deserialize, Serialize, Debug, Clone)]
1870pub struct BotCommand {
1871    pub command: String,
1873    pub description: String,
1875}
1876impl BotCommand {
1877    pub fn new(command: String, description: String) -> Self {
1878        Self {
1879            command,
1880            description,
1881        }
1882    }
1883}
1884
1885#[derive(Deserialize, Serialize, Debug, Clone)]
1887pub struct BotCommandScopeDefault {}
1888impl BotCommandScopeDefault {
1889    pub fn new() -> Self {
1890        Self {}
1891    }
1892}
1893
1894#[derive(Deserialize, Serialize, Debug, Clone)]
1896pub struct BotCommandScopeAllPrivateChats {}
1897impl BotCommandScopeAllPrivateChats {
1898    pub fn new() -> Self {
1899        Self {}
1900    }
1901}
1902
1903#[derive(Deserialize, Serialize, Debug, Clone)]
1905pub struct BotCommandScopeAllGroupChats {}
1906impl BotCommandScopeAllGroupChats {
1907    pub fn new() -> Self {
1908        Self {}
1909    }
1910}
1911
1912#[derive(Deserialize, Serialize, Debug, Clone)]
1914pub struct BotCommandScopeAllChatAdministrators {}
1915impl BotCommandScopeAllChatAdministrators {
1916    pub fn new() -> Self {
1917        Self {}
1918    }
1919}
1920
1921#[derive(Deserialize, Serialize, Debug, Clone)]
1923pub struct BotCommandScopeChat {
1924    pub chat_id: ChatId,
1926}
1927impl BotCommandScopeChat {
1928    pub fn new(chat_id: ChatId) -> Self {
1929        Self { chat_id }
1930    }
1931}
1932
1933#[derive(Deserialize, Serialize, Debug, Clone)]
1935pub struct BotCommandScopeChatAdministrators {
1936    pub chat_id: ChatId,
1938}
1939impl BotCommandScopeChatAdministrators {
1940    pub fn new(chat_id: ChatId) -> Self {
1941        Self { chat_id }
1942    }
1943}
1944
1945#[derive(Deserialize, Serialize, Debug, Clone)]
1947pub struct BotCommandScopeChatMember {
1948    pub chat_id: ChatId,
1950    pub user_id: i64,
1952}
1953impl BotCommandScopeChatMember {
1954    pub fn new(chat_id: ChatId, user_id: i64) -> Self {
1955        Self { chat_id, user_id }
1956    }
1957}
1958
1959#[derive(Deserialize, Serialize, Debug, Clone)]
1961pub struct MenuButtonCommands {}
1962impl MenuButtonCommands {
1963    pub fn new() -> Self {
1964        Self {}
1965    }
1966}
1967
1968#[derive(Deserialize, Serialize, Debug, Clone)]
1970pub struct MenuButtonWebApp {
1971    pub text: String,
1973    pub web_app: WebAppInfo,
1975}
1976impl MenuButtonWebApp {
1977    pub fn new(text: String, web_app: WebAppInfo) -> Self {
1978        Self { text, web_app }
1979    }
1980}
1981
1982#[derive(Deserialize, Serialize, Debug, Clone)]
1984pub struct MenuButtonDefault {}
1985impl MenuButtonDefault {
1986    pub fn new() -> Self {
1987        Self {}
1988    }
1989}
1990
1991#[derive(Deserialize, Serialize, Debug, Clone)]
1993pub struct ResponseParameters {
1994    #[serde(skip_serializing_if = "Option::is_none")]
1996    pub migrate_to_chat_id: Option<i64>,
1997    #[serde(skip_serializing_if = "Option::is_none")]
1999    pub retry_after: Option<i64>,
2000}
2001impl ResponseParameters {
2002    pub fn new() -> Self {
2003        Self {
2004            migrate_to_chat_id: None,
2005            retry_after: None,
2006        }
2007    }
2008}
2009
2010#[derive(Deserialize, Serialize, Debug, Clone)]
2012pub struct InputMediaPhoto {
2013    pub media: InputFile,
2015    #[serde(skip_serializing_if = "Option::is_none")]
2017    pub caption: Option<String>,
2018    #[serde(skip_serializing_if = "Option::is_none")]
2020    pub parse_mode: Option<String>,
2021    #[serde(skip_serializing_if = "Option::is_none")]
2023    pub caption_entities: Option<Vec<MessageEntity>>,
2024}
2025impl InputMediaPhoto {
2026    pub fn new(media: InputFile) -> Self {
2027        Self {
2028            media,
2029            caption: None,
2030            parse_mode: None,
2031            caption_entities: None,
2032        }
2033    }
2034}
2035
2036#[derive(Deserialize, Serialize, Debug, Clone)]
2038pub struct InputMediaVideo {
2039    pub media: InputFile,
2041    #[serde(skip_serializing_if = "Option::is_none")]
2043    pub thumb: Option<InputFile>,
2044    #[serde(skip_serializing_if = "Option::is_none")]
2046    pub caption: Option<String>,
2047    #[serde(skip_serializing_if = "Option::is_none")]
2049    pub parse_mode: Option<String>,
2050    #[serde(skip_serializing_if = "Option::is_none")]
2052    pub caption_entities: Option<Vec<MessageEntity>>,
2053    #[serde(skip_serializing_if = "Option::is_none")]
2055    pub width: Option<i64>,
2056    #[serde(skip_serializing_if = "Option::is_none")]
2058    pub height: Option<i64>,
2059    #[serde(skip_serializing_if = "Option::is_none")]
2061    pub duration: Option<i64>,
2062    #[serde(skip_serializing_if = "Option::is_none")]
2064    pub supports_streaming: Option<bool>,
2065}
2066impl InputMediaVideo {
2067    pub fn new(media: InputFile) -> Self {
2068        Self {
2069            media,
2070            thumb: None,
2071            caption: None,
2072            parse_mode: None,
2073            caption_entities: None,
2074            width: None,
2075            height: None,
2076            duration: None,
2077            supports_streaming: None,
2078        }
2079    }
2080}
2081
2082#[derive(Deserialize, Serialize, Debug, Clone)]
2084pub struct InputMediaAnimation {
2085    pub media: InputFile,
2087    #[serde(skip_serializing_if = "Option::is_none")]
2089    pub thumb: Option<InputFile>,
2090    #[serde(skip_serializing_if = "Option::is_none")]
2092    pub caption: Option<String>,
2093    #[serde(skip_serializing_if = "Option::is_none")]
2095    pub parse_mode: Option<String>,
2096    #[serde(skip_serializing_if = "Option::is_none")]
2098    pub caption_entities: Option<Vec<MessageEntity>>,
2099    #[serde(skip_serializing_if = "Option::is_none")]
2101    pub width: Option<i64>,
2102    #[serde(skip_serializing_if = "Option::is_none")]
2104    pub height: Option<i64>,
2105    #[serde(skip_serializing_if = "Option::is_none")]
2107    pub duration: Option<i64>,
2108}
2109impl InputMediaAnimation {
2110    pub fn new(media: InputFile) -> Self {
2111        Self {
2112            media,
2113            thumb: None,
2114            caption: None,
2115            parse_mode: None,
2116            caption_entities: None,
2117            width: None,
2118            height: None,
2119            duration: None,
2120        }
2121    }
2122}
2123
2124#[derive(Deserialize, Serialize, Debug, Clone)]
2126pub struct InputMediaAudio {
2127    pub media: InputFile,
2129    #[serde(skip_serializing_if = "Option::is_none")]
2131    pub thumb: Option<InputFile>,
2132    #[serde(skip_serializing_if = "Option::is_none")]
2134    pub caption: Option<String>,
2135    #[serde(skip_serializing_if = "Option::is_none")]
2137    pub parse_mode: Option<String>,
2138    #[serde(skip_serializing_if = "Option::is_none")]
2140    pub caption_entities: Option<Vec<MessageEntity>>,
2141    #[serde(skip_serializing_if = "Option::is_none")]
2143    pub duration: Option<i64>,
2144    #[serde(skip_serializing_if = "Option::is_none")]
2146    pub performer: Option<String>,
2147    #[serde(skip_serializing_if = "Option::is_none")]
2149    pub title: Option<String>,
2150}
2151impl InputMediaAudio {
2152    pub fn new(media: InputFile) -> Self {
2153        Self {
2154            media,
2155            thumb: None,
2156            caption: None,
2157            parse_mode: None,
2158            caption_entities: None,
2159            duration: None,
2160            performer: None,
2161            title: None,
2162        }
2163    }
2164}
2165
2166#[derive(Deserialize, Serialize, Debug, Clone)]
2168pub struct InputMediaDocument {
2169    pub media: InputFile,
2171    #[serde(skip_serializing_if = "Option::is_none")]
2173    pub thumb: Option<InputFile>,
2174    #[serde(skip_serializing_if = "Option::is_none")]
2176    pub caption: Option<String>,
2177    #[serde(skip_serializing_if = "Option::is_none")]
2179    pub parse_mode: Option<String>,
2180    #[serde(skip_serializing_if = "Option::is_none")]
2182    pub caption_entities: Option<Vec<MessageEntity>>,
2183    #[serde(skip_serializing_if = "Option::is_none")]
2185    pub disable_content_type_detection: Option<bool>,
2186}
2187impl InputMediaDocument {
2188    pub fn new(media: InputFile) -> Self {
2189        Self {
2190            media,
2191            thumb: None,
2192            caption: None,
2193            parse_mode: None,
2194            caption_entities: None,
2195            disable_content_type_detection: None,
2196        }
2197    }
2198}
2199
2200#[derive(Deserialize, Serialize, Debug, Clone)]
2202pub struct Sticker {
2203    pub file_id: String,
2205    pub file_unique_id: String,
2207    #[serde(rename = "type")]
2209    pub type_name: String,
2210    pub width: i64,
2212    pub height: i64,
2214    pub is_animated: bool,
2216    pub is_video: bool,
2218    #[serde(skip_serializing_if = "Option::is_none")]
2220    pub thumb: Option<PhotoSize>,
2221    #[serde(skip_serializing_if = "Option::is_none")]
2223    pub emoji: Option<String>,
2224    #[serde(skip_serializing_if = "Option::is_none")]
2226    pub set_name: Option<String>,
2227    #[serde(skip_serializing_if = "Option::is_none")]
2229    pub premium_animation: Option<File>,
2230    #[serde(skip_serializing_if = "Option::is_none")]
2232    pub mask_position: Option<MaskPosition>,
2233    #[serde(skip_serializing_if = "Option::is_none")]
2235    pub custom_emoji_id: Option<String>,
2236    #[serde(skip_serializing_if = "Option::is_none")]
2238    pub file_size: Option<i64>,
2239}
2240impl Sticker {
2241    pub fn new(
2242        file_id: String,
2243        file_unique_id: String,
2244        type_name: String,
2245        width: i64,
2246        height: i64,
2247        is_animated: bool,
2248        is_video: bool,
2249    ) -> Self {
2250        Self {
2251            file_id,
2252            file_unique_id,
2253            type_name,
2254            width,
2255            height,
2256            is_animated,
2257            is_video,
2258            thumb: None,
2259            emoji: None,
2260            set_name: None,
2261            premium_animation: None,
2262            mask_position: None,
2263            custom_emoji_id: None,
2264            file_size: None,
2265        }
2266    }
2267}
2268
2269#[derive(Deserialize, Serialize, Debug, Clone)]
2271pub struct StickerSet {
2272    pub name: String,
2274    pub title: String,
2276    pub sticker_type: String,
2278    pub is_animated: bool,
2280    pub is_video: bool,
2282    pub stickers: Vec<Sticker>,
2284    #[serde(skip_serializing_if = "Option::is_none")]
2286    pub thumb: Option<PhotoSize>,
2287}
2288impl StickerSet {
2289    pub fn new(
2290        name: String,
2291        title: String,
2292        sticker_type: String,
2293        is_animated: bool,
2294        is_video: bool,
2295        stickers: Vec<Sticker>,
2296    ) -> Self {
2297        Self {
2298            name,
2299            title,
2300            sticker_type,
2301            is_animated,
2302            is_video,
2303            stickers,
2304            thumb: None,
2305        }
2306    }
2307}
2308
2309#[derive(Deserialize, Serialize, Debug, Clone)]
2311pub struct MaskPosition {
2312    pub point: String,
2314    pub x_shift: f64,
2316    pub y_shift: f64,
2318    pub scale: f64,
2320}
2321impl MaskPosition {
2322    pub fn new(point: String, x_shift: f64, y_shift: f64, scale: f64) -> Self {
2323        Self {
2324            point,
2325            x_shift,
2326            y_shift,
2327            scale,
2328        }
2329    }
2330}
2331
2332#[derive(Deserialize, Serialize, Debug, Clone)]
2334pub struct InlineQuery {
2335    pub id: String,
2337    pub from: User,
2339    pub query: String,
2341    pub offset: String,
2343    #[serde(skip_serializing_if = "Option::is_none")]
2345    pub chat_type: Option<String>,
2346    #[serde(skip_serializing_if = "Option::is_none")]
2348    pub location: Option<Location>,
2349}
2350impl InlineQuery {
2351    pub fn new(id: String, from: User, query: String, offset: String) -> Self {
2352        Self {
2353            id,
2354            from,
2355            query,
2356            offset,
2357            chat_type: None,
2358            location: None,
2359        }
2360    }
2361}
2362
2363#[derive(Deserialize, Serialize, Debug, Clone)]
2365pub struct InlineQueryResultArticle {
2366    pub id: String,
2368    pub title: String,
2370    pub input_message_content: InputMessageContent,
2372    #[serde(skip_serializing_if = "Option::is_none")]
2374    pub reply_markup: Option<InlineKeyboardMarkup>,
2375    #[serde(skip_serializing_if = "Option::is_none")]
2377    pub url: Option<String>,
2378    #[serde(skip_serializing_if = "Option::is_none")]
2380    pub hide_url: Option<bool>,
2381    #[serde(skip_serializing_if = "Option::is_none")]
2383    pub description: Option<String>,
2384    #[serde(skip_serializing_if = "Option::is_none")]
2386    pub thumb_url: Option<String>,
2387    #[serde(skip_serializing_if = "Option::is_none")]
2389    pub thumb_width: Option<i64>,
2390    #[serde(skip_serializing_if = "Option::is_none")]
2392    pub thumb_height: Option<i64>,
2393}
2394impl InlineQueryResultArticle {
2395    pub fn new(id: String, title: String, input_message_content: InputMessageContent) -> Self {
2396        Self {
2397            id,
2398            title,
2399            input_message_content,
2400            reply_markup: None,
2401            url: None,
2402            hide_url: None,
2403            description: None,
2404            thumb_url: None,
2405            thumb_width: None,
2406            thumb_height: None,
2407        }
2408    }
2409}
2410
2411#[derive(Deserialize, Serialize, Debug, Clone)]
2413pub struct InlineQueryResultPhoto {
2414    pub id: String,
2416    pub photo_url: String,
2418    pub thumb_url: String,
2420    #[serde(skip_serializing_if = "Option::is_none")]
2422    pub photo_width: Option<i64>,
2423    #[serde(skip_serializing_if = "Option::is_none")]
2425    pub photo_height: Option<i64>,
2426    #[serde(skip_serializing_if = "Option::is_none")]
2428    pub title: Option<String>,
2429    #[serde(skip_serializing_if = "Option::is_none")]
2431    pub description: Option<String>,
2432    #[serde(skip_serializing_if = "Option::is_none")]
2434    pub caption: Option<String>,
2435    #[serde(skip_serializing_if = "Option::is_none")]
2437    pub parse_mode: Option<String>,
2438    #[serde(skip_serializing_if = "Option::is_none")]
2440    pub caption_entities: Option<Vec<MessageEntity>>,
2441    #[serde(skip_serializing_if = "Option::is_none")]
2443    pub reply_markup: Option<InlineKeyboardMarkup>,
2444    #[serde(skip_serializing_if = "Option::is_none")]
2446    pub input_message_content: Option<InputMessageContent>,
2447}
2448impl InlineQueryResultPhoto {
2449    pub fn new(id: String, photo_url: String, thumb_url: String) -> Self {
2450        Self {
2451            id,
2452            photo_url,
2453            thumb_url,
2454            photo_width: None,
2455            photo_height: None,
2456            title: None,
2457            description: None,
2458            caption: None,
2459            parse_mode: None,
2460            caption_entities: None,
2461            reply_markup: None,
2462            input_message_content: None,
2463        }
2464    }
2465}
2466
2467#[derive(Deserialize, Serialize, Debug, Clone)]
2469pub struct InlineQueryResultGif {
2470    pub id: String,
2472    pub gif_url: String,
2474    #[serde(skip_serializing_if = "Option::is_none")]
2476    pub gif_width: Option<i64>,
2477    #[serde(skip_serializing_if = "Option::is_none")]
2479    pub gif_height: Option<i64>,
2480    #[serde(skip_serializing_if = "Option::is_none")]
2482    pub gif_duration: Option<i64>,
2483    pub thumb_url: String,
2485    #[serde(skip_serializing_if = "Option::is_none")]
2487    pub thumb_mime_type: Option<String>,
2488    #[serde(skip_serializing_if = "Option::is_none")]
2490    pub title: Option<String>,
2491    #[serde(skip_serializing_if = "Option::is_none")]
2493    pub caption: Option<String>,
2494    #[serde(skip_serializing_if = "Option::is_none")]
2496    pub parse_mode: Option<String>,
2497    #[serde(skip_serializing_if = "Option::is_none")]
2499    pub caption_entities: Option<Vec<MessageEntity>>,
2500    #[serde(skip_serializing_if = "Option::is_none")]
2502    pub reply_markup: Option<InlineKeyboardMarkup>,
2503    #[serde(skip_serializing_if = "Option::is_none")]
2505    pub input_message_content: Option<InputMessageContent>,
2506}
2507impl InlineQueryResultGif {
2508    pub fn new(id: String, gif_url: String, thumb_url: String) -> Self {
2509        Self {
2510            id,
2511            gif_url,
2512            gif_width: None,
2513            gif_height: None,
2514            gif_duration: None,
2515            thumb_url,
2516            thumb_mime_type: None,
2517            title: None,
2518            caption: None,
2519            parse_mode: None,
2520            caption_entities: None,
2521            reply_markup: None,
2522            input_message_content: None,
2523        }
2524    }
2525}
2526
2527#[derive(Deserialize, Serialize, Debug, Clone)]
2529pub struct InlineQueryResultMpeg4Gif {
2530    pub id: String,
2532    pub mpeg4_url: String,
2534    #[serde(skip_serializing_if = "Option::is_none")]
2536    pub mpeg4_width: Option<i64>,
2537    #[serde(skip_serializing_if = "Option::is_none")]
2539    pub mpeg4_height: Option<i64>,
2540    #[serde(skip_serializing_if = "Option::is_none")]
2542    pub mpeg4_duration: Option<i64>,
2543    pub thumb_url: String,
2545    #[serde(skip_serializing_if = "Option::is_none")]
2547    pub thumb_mime_type: Option<String>,
2548    #[serde(skip_serializing_if = "Option::is_none")]
2550    pub title: Option<String>,
2551    #[serde(skip_serializing_if = "Option::is_none")]
2553    pub caption: Option<String>,
2554    #[serde(skip_serializing_if = "Option::is_none")]
2556    pub parse_mode: Option<String>,
2557    #[serde(skip_serializing_if = "Option::is_none")]
2559    pub caption_entities: Option<Vec<MessageEntity>>,
2560    #[serde(skip_serializing_if = "Option::is_none")]
2562    pub reply_markup: Option<InlineKeyboardMarkup>,
2563    #[serde(skip_serializing_if = "Option::is_none")]
2565    pub input_message_content: Option<InputMessageContent>,
2566}
2567impl InlineQueryResultMpeg4Gif {
2568    pub fn new(id: String, mpeg4_url: String, thumb_url: String) -> Self {
2569        Self {
2570            id,
2571            mpeg4_url,
2572            mpeg4_width: None,
2573            mpeg4_height: None,
2574            mpeg4_duration: None,
2575            thumb_url,
2576            thumb_mime_type: None,
2577            title: None,
2578            caption: None,
2579            parse_mode: None,
2580            caption_entities: None,
2581            reply_markup: None,
2582            input_message_content: None,
2583        }
2584    }
2585}
2586
2587#[derive(Deserialize, Serialize, Debug, Clone)]
2589pub struct InlineQueryResultVideo {
2590    pub id: String,
2592    pub video_url: String,
2594    pub mime_type: String,
2596    pub thumb_url: String,
2598    pub title: String,
2600    #[serde(skip_serializing_if = "Option::is_none")]
2602    pub caption: Option<String>,
2603    #[serde(skip_serializing_if = "Option::is_none")]
2605    pub parse_mode: Option<String>,
2606    #[serde(skip_serializing_if = "Option::is_none")]
2608    pub caption_entities: Option<Vec<MessageEntity>>,
2609    #[serde(skip_serializing_if = "Option::is_none")]
2611    pub video_width: Option<i64>,
2612    #[serde(skip_serializing_if = "Option::is_none")]
2614    pub video_height: Option<i64>,
2615    #[serde(skip_serializing_if = "Option::is_none")]
2617    pub video_duration: Option<i64>,
2618    #[serde(skip_serializing_if = "Option::is_none")]
2620    pub description: Option<String>,
2621    #[serde(skip_serializing_if = "Option::is_none")]
2623    pub reply_markup: Option<InlineKeyboardMarkup>,
2624    #[serde(skip_serializing_if = "Option::is_none")]
2626    pub input_message_content: Option<InputMessageContent>,
2627}
2628impl InlineQueryResultVideo {
2629    pub fn new(
2630        id: String,
2631        video_url: String,
2632        mime_type: String,
2633        thumb_url: String,
2634        title: String,
2635    ) -> Self {
2636        Self {
2637            id,
2638            video_url,
2639            mime_type,
2640            thumb_url,
2641            title,
2642            caption: None,
2643            parse_mode: None,
2644            caption_entities: None,
2645            video_width: None,
2646            video_height: None,
2647            video_duration: None,
2648            description: None,
2649            reply_markup: None,
2650            input_message_content: None,
2651        }
2652    }
2653}
2654
2655#[derive(Deserialize, Serialize, Debug, Clone)]
2657pub struct InlineQueryResultAudio {
2658    pub id: String,
2660    pub audio_url: String,
2662    pub title: String,
2664    #[serde(skip_serializing_if = "Option::is_none")]
2666    pub caption: Option<String>,
2667    #[serde(skip_serializing_if = "Option::is_none")]
2669    pub parse_mode: Option<String>,
2670    #[serde(skip_serializing_if = "Option::is_none")]
2672    pub caption_entities: Option<Vec<MessageEntity>>,
2673    #[serde(skip_serializing_if = "Option::is_none")]
2675    pub performer: Option<String>,
2676    #[serde(skip_serializing_if = "Option::is_none")]
2678    pub audio_duration: Option<i64>,
2679    #[serde(skip_serializing_if = "Option::is_none")]
2681    pub reply_markup: Option<InlineKeyboardMarkup>,
2682    #[serde(skip_serializing_if = "Option::is_none")]
2684    pub input_message_content: Option<InputMessageContent>,
2685}
2686impl InlineQueryResultAudio {
2687    pub fn new(id: String, audio_url: String, title: String) -> Self {
2688        Self {
2689            id,
2690            audio_url,
2691            title,
2692            caption: None,
2693            parse_mode: None,
2694            caption_entities: None,
2695            performer: None,
2696            audio_duration: None,
2697            reply_markup: None,
2698            input_message_content: None,
2699        }
2700    }
2701}
2702
2703#[derive(Deserialize, Serialize, Debug, Clone)]
2705pub struct InlineQueryResultVoice {
2706    pub id: String,
2708    pub voice_url: String,
2710    pub title: String,
2712    #[serde(skip_serializing_if = "Option::is_none")]
2714    pub caption: Option<String>,
2715    #[serde(skip_serializing_if = "Option::is_none")]
2717    pub parse_mode: Option<String>,
2718    #[serde(skip_serializing_if = "Option::is_none")]
2720    pub caption_entities: Option<Vec<MessageEntity>>,
2721    #[serde(skip_serializing_if = "Option::is_none")]
2723    pub voice_duration: Option<i64>,
2724    #[serde(skip_serializing_if = "Option::is_none")]
2726    pub reply_markup: Option<InlineKeyboardMarkup>,
2727    #[serde(skip_serializing_if = "Option::is_none")]
2729    pub input_message_content: Option<InputMessageContent>,
2730}
2731impl InlineQueryResultVoice {
2732    pub fn new(id: String, voice_url: String, title: String) -> Self {
2733        Self {
2734            id,
2735            voice_url,
2736            title,
2737            caption: None,
2738            parse_mode: None,
2739            caption_entities: None,
2740            voice_duration: None,
2741            reply_markup: None,
2742            input_message_content: None,
2743        }
2744    }
2745}
2746
2747#[derive(Deserialize, Serialize, Debug, Clone)]
2749pub struct InlineQueryResultDocument {
2750    pub id: String,
2752    pub title: String,
2754    #[serde(skip_serializing_if = "Option::is_none")]
2756    pub caption: Option<String>,
2757    #[serde(skip_serializing_if = "Option::is_none")]
2759    pub parse_mode: Option<String>,
2760    #[serde(skip_serializing_if = "Option::is_none")]
2762    pub caption_entities: Option<Vec<MessageEntity>>,
2763    pub document_url: String,
2765    pub mime_type: String,
2767    #[serde(skip_serializing_if = "Option::is_none")]
2769    pub description: Option<String>,
2770    #[serde(skip_serializing_if = "Option::is_none")]
2772    pub reply_markup: Option<InlineKeyboardMarkup>,
2773    #[serde(skip_serializing_if = "Option::is_none")]
2775    pub input_message_content: Option<InputMessageContent>,
2776    #[serde(skip_serializing_if = "Option::is_none")]
2778    pub thumb_url: Option<String>,
2779    #[serde(skip_serializing_if = "Option::is_none")]
2781    pub thumb_width: Option<i64>,
2782    #[serde(skip_serializing_if = "Option::is_none")]
2784    pub thumb_height: Option<i64>,
2785}
2786impl InlineQueryResultDocument {
2787    pub fn new(id: String, title: String, document_url: String, mime_type: String) -> Self {
2788        Self {
2789            id,
2790            title,
2791            caption: None,
2792            parse_mode: None,
2793            caption_entities: None,
2794            document_url,
2795            mime_type,
2796            description: None,
2797            reply_markup: None,
2798            input_message_content: None,
2799            thumb_url: None,
2800            thumb_width: None,
2801            thumb_height: None,
2802        }
2803    }
2804}
2805
2806#[derive(Deserialize, Serialize, Debug, Clone)]
2808pub struct InlineQueryResultLocation {
2809    pub id: String,
2811    pub latitude: f64,
2813    pub longitude: f64,
2815    pub title: String,
2817    #[serde(skip_serializing_if = "Option::is_none")]
2819    pub horizontal_accuracy: Option<f64>,
2820    #[serde(skip_serializing_if = "Option::is_none")]
2822    pub live_period: Option<i64>,
2823    #[serde(skip_serializing_if = "Option::is_none")]
2825    pub heading: Option<i64>,
2826    #[serde(skip_serializing_if = "Option::is_none")]
2828    pub proximity_alert_radius: Option<i64>,
2829    #[serde(skip_serializing_if = "Option::is_none")]
2831    pub reply_markup: Option<InlineKeyboardMarkup>,
2832    #[serde(skip_serializing_if = "Option::is_none")]
2834    pub input_message_content: Option<InputMessageContent>,
2835    #[serde(skip_serializing_if = "Option::is_none")]
2837    pub thumb_url: Option<String>,
2838    #[serde(skip_serializing_if = "Option::is_none")]
2840    pub thumb_width: Option<i64>,
2841    #[serde(skip_serializing_if = "Option::is_none")]
2843    pub thumb_height: Option<i64>,
2844}
2845impl InlineQueryResultLocation {
2846    pub fn new(id: String, latitude: f64, longitude: f64, title: String) -> Self {
2847        Self {
2848            id,
2849            latitude,
2850            longitude,
2851            title,
2852            horizontal_accuracy: None,
2853            live_period: None,
2854            heading: None,
2855            proximity_alert_radius: None,
2856            reply_markup: None,
2857            input_message_content: None,
2858            thumb_url: None,
2859            thumb_width: None,
2860            thumb_height: None,
2861        }
2862    }
2863}
2864
2865#[derive(Deserialize, Serialize, Debug, Clone)]
2867pub struct InlineQueryResultVenue {
2868    pub id: String,
2870    pub latitude: f64,
2872    pub longitude: f64,
2874    pub title: String,
2876    pub address: String,
2878    #[serde(skip_serializing_if = "Option::is_none")]
2880    pub foursquare_id: Option<String>,
2881    #[serde(skip_serializing_if = "Option::is_none")]
2883    pub foursquare_type: Option<String>,
2884    #[serde(skip_serializing_if = "Option::is_none")]
2886    pub google_place_id: Option<String>,
2887    #[serde(skip_serializing_if = "Option::is_none")]
2889    pub google_place_type: Option<String>,
2890    #[serde(skip_serializing_if = "Option::is_none")]
2892    pub reply_markup: Option<InlineKeyboardMarkup>,
2893    #[serde(skip_serializing_if = "Option::is_none")]
2895    pub input_message_content: Option<InputMessageContent>,
2896    #[serde(skip_serializing_if = "Option::is_none")]
2898    pub thumb_url: Option<String>,
2899    #[serde(skip_serializing_if = "Option::is_none")]
2901    pub thumb_width: Option<i64>,
2902    #[serde(skip_serializing_if = "Option::is_none")]
2904    pub thumb_height: Option<i64>,
2905}
2906impl InlineQueryResultVenue {
2907    pub fn new(id: String, latitude: f64, longitude: f64, title: String, address: String) -> Self {
2908        Self {
2909            id,
2910            latitude,
2911            longitude,
2912            title,
2913            address,
2914            foursquare_id: None,
2915            foursquare_type: None,
2916            google_place_id: None,
2917            google_place_type: None,
2918            reply_markup: None,
2919            input_message_content: None,
2920            thumb_url: None,
2921            thumb_width: None,
2922            thumb_height: None,
2923        }
2924    }
2925}
2926
2927#[derive(Deserialize, Serialize, Debug, Clone)]
2929pub struct InlineQueryResultContact {
2930    pub id: String,
2932    pub phone_number: String,
2934    pub first_name: String,
2936    #[serde(skip_serializing_if = "Option::is_none")]
2938    pub last_name: Option<String>,
2939    #[serde(skip_serializing_if = "Option::is_none")]
2941    pub vcard: Option<String>,
2942    #[serde(skip_serializing_if = "Option::is_none")]
2944    pub reply_markup: Option<InlineKeyboardMarkup>,
2945    #[serde(skip_serializing_if = "Option::is_none")]
2947    pub input_message_content: Option<InputMessageContent>,
2948    #[serde(skip_serializing_if = "Option::is_none")]
2950    pub thumb_url: Option<String>,
2951    #[serde(skip_serializing_if = "Option::is_none")]
2953    pub thumb_width: Option<i64>,
2954    #[serde(skip_serializing_if = "Option::is_none")]
2956    pub thumb_height: Option<i64>,
2957}
2958impl InlineQueryResultContact {
2959    pub fn new(id: String, phone_number: String, first_name: String) -> Self {
2960        Self {
2961            id,
2962            phone_number,
2963            first_name,
2964            last_name: None,
2965            vcard: None,
2966            reply_markup: None,
2967            input_message_content: None,
2968            thumb_url: None,
2969            thumb_width: None,
2970            thumb_height: None,
2971        }
2972    }
2973}
2974
2975#[derive(Deserialize, Serialize, Debug, Clone)]
2977pub struct InlineQueryResultGame {
2978    pub id: String,
2980    pub game_short_name: String,
2982    #[serde(skip_serializing_if = "Option::is_none")]
2984    pub reply_markup: Option<InlineKeyboardMarkup>,
2985}
2986impl InlineQueryResultGame {
2987    pub fn new(id: String, game_short_name: String) -> Self {
2988        Self {
2989            id,
2990            game_short_name,
2991            reply_markup: None,
2992        }
2993    }
2994}
2995
2996#[derive(Deserialize, Serialize, Debug, Clone)]
2998pub struct InlineQueryResultCachedPhoto {
2999    pub id: String,
3001    pub photo_file_id: String,
3003    #[serde(skip_serializing_if = "Option::is_none")]
3005    pub title: Option<String>,
3006    #[serde(skip_serializing_if = "Option::is_none")]
3008    pub description: Option<String>,
3009    #[serde(skip_serializing_if = "Option::is_none")]
3011    pub caption: Option<String>,
3012    #[serde(skip_serializing_if = "Option::is_none")]
3014    pub parse_mode: Option<String>,
3015    #[serde(skip_serializing_if = "Option::is_none")]
3017    pub caption_entities: Option<Vec<MessageEntity>>,
3018    #[serde(skip_serializing_if = "Option::is_none")]
3020    pub reply_markup: Option<InlineKeyboardMarkup>,
3021    #[serde(skip_serializing_if = "Option::is_none")]
3023    pub input_message_content: Option<InputMessageContent>,
3024}
3025impl InlineQueryResultCachedPhoto {
3026    pub fn new(id: String, photo_file_id: String) -> Self {
3027        Self {
3028            id,
3029            photo_file_id,
3030            title: None,
3031            description: None,
3032            caption: None,
3033            parse_mode: None,
3034            caption_entities: None,
3035            reply_markup: None,
3036            input_message_content: None,
3037        }
3038    }
3039}
3040
3041#[derive(Deserialize, Serialize, Debug, Clone)]
3043pub struct InlineQueryResultCachedGif {
3044    pub id: String,
3046    pub gif_file_id: String,
3048    #[serde(skip_serializing_if = "Option::is_none")]
3050    pub title: Option<String>,
3051    #[serde(skip_serializing_if = "Option::is_none")]
3053    pub caption: Option<String>,
3054    #[serde(skip_serializing_if = "Option::is_none")]
3056    pub parse_mode: Option<String>,
3057    #[serde(skip_serializing_if = "Option::is_none")]
3059    pub caption_entities: Option<Vec<MessageEntity>>,
3060    #[serde(skip_serializing_if = "Option::is_none")]
3062    pub reply_markup: Option<InlineKeyboardMarkup>,
3063    #[serde(skip_serializing_if = "Option::is_none")]
3065    pub input_message_content: Option<InputMessageContent>,
3066}
3067impl InlineQueryResultCachedGif {
3068    pub fn new(id: String, gif_file_id: String) -> Self {
3069        Self {
3070            id,
3071            gif_file_id,
3072            title: None,
3073            caption: None,
3074            parse_mode: None,
3075            caption_entities: None,
3076            reply_markup: None,
3077            input_message_content: None,
3078        }
3079    }
3080}
3081
3082#[derive(Deserialize, Serialize, Debug, Clone)]
3084pub struct InlineQueryResultCachedMpeg4Gif {
3085    pub id: String,
3087    pub mpeg4_file_id: String,
3089    #[serde(skip_serializing_if = "Option::is_none")]
3091    pub title: Option<String>,
3092    #[serde(skip_serializing_if = "Option::is_none")]
3094    pub caption: Option<String>,
3095    #[serde(skip_serializing_if = "Option::is_none")]
3097    pub parse_mode: Option<String>,
3098    #[serde(skip_serializing_if = "Option::is_none")]
3100    pub caption_entities: Option<Vec<MessageEntity>>,
3101    #[serde(skip_serializing_if = "Option::is_none")]
3103    pub reply_markup: Option<InlineKeyboardMarkup>,
3104    #[serde(skip_serializing_if = "Option::is_none")]
3106    pub input_message_content: Option<InputMessageContent>,
3107}
3108impl InlineQueryResultCachedMpeg4Gif {
3109    pub fn new(id: String, mpeg4_file_id: String) -> Self {
3110        Self {
3111            id,
3112            mpeg4_file_id,
3113            title: None,
3114            caption: None,
3115            parse_mode: None,
3116            caption_entities: None,
3117            reply_markup: None,
3118            input_message_content: None,
3119        }
3120    }
3121}
3122
3123#[derive(Deserialize, Serialize, Debug, Clone)]
3125pub struct InlineQueryResultCachedSticker {
3126    pub id: String,
3128    pub sticker_file_id: String,
3130    #[serde(skip_serializing_if = "Option::is_none")]
3132    pub reply_markup: Option<InlineKeyboardMarkup>,
3133    pub input_message_content: Option<InputMessageContent>,
3135}
3136impl InlineQueryResultCachedSticker {
3137    pub fn new(id: String, sticker_file_id: String) -> Self {
3138        Self {
3139            id,
3140            sticker_file_id,
3141            reply_markup: None,
3142            input_message_content: None,
3143        }
3144    }
3145}
3146
3147#[derive(Deserialize, Serialize, Debug, Clone)]
3149pub struct InlineQueryResultCachedDocument {
3150    pub id: String,
3152    pub title: String,
3154    pub document_file_id: String,
3156    #[serde(skip_serializing_if = "Option::is_none")]
3158    pub description: Option<String>,
3159    #[serde(skip_serializing_if = "Option::is_none")]
3161    pub caption: Option<String>,
3162    #[serde(skip_serializing_if = "Option::is_none")]
3164    pub parse_mode: Option<String>,
3165    #[serde(skip_serializing_if = "Option::is_none")]
3167    pub caption_entities: Option<Vec<MessageEntity>>,
3168    #[serde(skip_serializing_if = "Option::is_none")]
3170    pub reply_markup: Option<InlineKeyboardMarkup>,
3171    #[serde(skip_serializing_if = "Option::is_none")]
3173    pub input_message_content: Option<InputMessageContent>,
3174}
3175impl InlineQueryResultCachedDocument {
3176    pub fn new(id: String, title: String, document_file_id: String) -> Self {
3177        Self {
3178            id,
3179            title,
3180            document_file_id,
3181            description: None,
3182            caption: None,
3183            parse_mode: None,
3184            caption_entities: None,
3185            reply_markup: None,
3186            input_message_content: None,
3187        }
3188    }
3189}
3190
3191#[derive(Deserialize, Serialize, Debug, Clone)]
3193pub struct InlineQueryResultCachedVideo {
3194    pub id: String,
3196    pub video_file_id: String,
3198    pub title: String,
3200    #[serde(skip_serializing_if = "Option::is_none")]
3202    pub description: Option<String>,
3203    #[serde(skip_serializing_if = "Option::is_none")]
3205    pub caption: Option<String>,
3206    #[serde(skip_serializing_if = "Option::is_none")]
3208    pub parse_mode: Option<String>,
3209    #[serde(skip_serializing_if = "Option::is_none")]
3211    pub caption_entities: Option<Vec<MessageEntity>>,
3212    #[serde(skip_serializing_if = "Option::is_none")]
3214    pub reply_markup: Option<InlineKeyboardMarkup>,
3215    #[serde(skip_serializing_if = "Option::is_none")]
3217    pub input_message_content: Option<InputMessageContent>,
3218}
3219impl InlineQueryResultCachedVideo {
3220    pub fn new(id: String, video_file_id: String, title: String) -> Self {
3221        Self {
3222            id,
3223            video_file_id,
3224            title,
3225            description: None,
3226            caption: None,
3227            parse_mode: None,
3228            caption_entities: None,
3229            reply_markup: None,
3230            input_message_content: None,
3231        }
3232    }
3233}
3234
3235#[derive(Deserialize, Serialize, Debug, Clone)]
3237pub struct InlineQueryResultCachedVoice {
3238    pub id: String,
3240    pub voice_file_id: String,
3242    pub title: String,
3244    #[serde(skip_serializing_if = "Option::is_none")]
3246    pub caption: Option<String>,
3247    #[serde(skip_serializing_if = "Option::is_none")]
3249    pub parse_mode: Option<String>,
3250    #[serde(skip_serializing_if = "Option::is_none")]
3252    pub caption_entities: Option<Vec<MessageEntity>>,
3253    #[serde(skip_serializing_if = "Option::is_none")]
3255    pub reply_markup: Option<InlineKeyboardMarkup>,
3256    #[serde(skip_serializing_if = "Option::is_none")]
3258    pub input_message_content: Option<InputMessageContent>,
3259}
3260impl InlineQueryResultCachedVoice {
3261    pub fn new(id: String, voice_file_id: String, title: String) -> Self {
3262        Self {
3263            id,
3264            voice_file_id,
3265            title,
3266            caption: None,
3267            parse_mode: None,
3268            caption_entities: None,
3269            reply_markup: None,
3270            input_message_content: None,
3271        }
3272    }
3273}
3274
3275#[derive(Deserialize, Serialize, Debug, Clone)]
3277pub struct InlineQueryResultCachedAudio {
3278    pub id: String,
3280    pub audio_file_id: String,
3282    #[serde(skip_serializing_if = "Option::is_none")]
3284    pub caption: Option<String>,
3285    #[serde(skip_serializing_if = "Option::is_none")]
3287    pub parse_mode: Option<String>,
3288    #[serde(skip_serializing_if = "Option::is_none")]
3290    pub caption_entities: Option<Vec<MessageEntity>>,
3291    #[serde(skip_serializing_if = "Option::is_none")]
3293    pub reply_markup: Option<InlineKeyboardMarkup>,
3294    #[serde(skip_serializing_if = "Option::is_none")]
3296    pub input_message_content: Option<InputMessageContent>,
3297}
3298impl InlineQueryResultCachedAudio {
3299    pub fn new(id: String, audio_file_id: String) -> Self {
3300        Self {
3301            id,
3302            audio_file_id,
3303            caption: None,
3304            parse_mode: None,
3305            caption_entities: None,
3306            reply_markup: None,
3307            input_message_content: None,
3308        }
3309    }
3310}
3311
3312#[derive(Deserialize, Serialize, Debug, Clone)]
3314pub struct InputTextMessageContent {
3315    pub message_text: String,
3317    #[serde(skip_serializing_if = "Option::is_none")]
3319    pub parse_mode: Option<String>,
3320    #[serde(skip_serializing_if = "Option::is_none")]
3322    pub entities: Option<Vec<MessageEntity>>,
3323    #[serde(skip_serializing_if = "Option::is_none")]
3325    pub disable_web_page_preview: Option<bool>,
3326}
3327impl InputTextMessageContent {
3328    pub fn new(message_text: String) -> Self {
3329        Self {
3330            message_text,
3331            parse_mode: None,
3332            entities: None,
3333            disable_web_page_preview: None,
3334        }
3335    }
3336}
3337
3338#[derive(Deserialize, Serialize, Debug, Clone)]
3340pub struct InputLocationMessageContent {
3341    pub latitude: f64,
3343    pub longitude: f64,
3345    #[serde(skip_serializing_if = "Option::is_none")]
3347    pub horizontal_accuracy: Option<f64>,
3348    #[serde(skip_serializing_if = "Option::is_none")]
3350    pub live_period: Option<i64>,
3351    #[serde(skip_serializing_if = "Option::is_none")]
3353    pub heading: Option<i64>,
3354    #[serde(skip_serializing_if = "Option::is_none")]
3356    pub proximity_alert_radius: Option<i64>,
3357}
3358impl InputLocationMessageContent {
3359    pub fn new(latitude: f64, longitude: f64) -> Self {
3360        Self {
3361            latitude,
3362            longitude,
3363            horizontal_accuracy: None,
3364            live_period: None,
3365            heading: None,
3366            proximity_alert_radius: None,
3367        }
3368    }
3369}
3370
3371#[derive(Deserialize, Serialize, Debug, Clone)]
3373pub struct InputVenueMessageContent {
3374    pub latitude: f64,
3376    pub longitude: f64,
3378    pub title: String,
3380    pub address: String,
3382    #[serde(skip_serializing_if = "Option::is_none")]
3384    pub foursquare_id: Option<String>,
3385    #[serde(skip_serializing_if = "Option::is_none")]
3387    pub foursquare_type: Option<String>,
3388    #[serde(skip_serializing_if = "Option::is_none")]
3390    pub google_place_id: Option<String>,
3391    #[serde(skip_serializing_if = "Option::is_none")]
3393    pub google_place_type: Option<String>,
3394}
3395impl InputVenueMessageContent {
3396    pub fn new(latitude: f64, longitude: f64, title: String, address: String) -> Self {
3397        Self {
3398            latitude,
3399            longitude,
3400            title,
3401            address,
3402            foursquare_id: None,
3403            foursquare_type: None,
3404            google_place_id: None,
3405            google_place_type: None,
3406        }
3407    }
3408}
3409
3410#[derive(Deserialize, Serialize, Debug, Clone)]
3412pub struct InputContactMessageContent {
3413    pub phone_number: String,
3415    pub first_name: String,
3417    #[serde(skip_serializing_if = "Option::is_none")]
3419    pub last_name: Option<String>,
3420    #[serde(skip_serializing_if = "Option::is_none")]
3422    pub vcard: Option<String>,
3423}
3424impl InputContactMessageContent {
3425    pub fn new(phone_number: String, first_name: String) -> Self {
3426        Self {
3427            phone_number,
3428            first_name,
3429            last_name: None,
3430            vcard: None,
3431        }
3432    }
3433}
3434
3435#[derive(Deserialize, Serialize, Debug, Clone)]
3437pub struct InputInvoiceMessageContent {
3438    pub title: String,
3440    pub description: String,
3442    pub payload: String,
3444    pub provider_token: String,
3446    pub currency: String,
3448    pub prices: Vec<LabeledPrice>,
3450    #[serde(skip_serializing_if = "Option::is_none")]
3452    pub max_tip_amount: Option<i64>,
3453    #[serde(skip_serializing_if = "Option::is_none")]
3455    pub suggested_tip_amounts: Option<Vec<i64>>,
3456    #[serde(skip_serializing_if = "Option::is_none")]
3458    pub provider_data: Option<String>,
3459    #[serde(skip_serializing_if = "Option::is_none")]
3461    pub photo_url: Option<String>,
3462    #[serde(skip_serializing_if = "Option::is_none")]
3464    pub photo_size: Option<i64>,
3465    #[serde(skip_serializing_if = "Option::is_none")]
3467    pub photo_width: Option<i64>,
3468    #[serde(skip_serializing_if = "Option::is_none")]
3470    pub photo_height: Option<i64>,
3471    #[serde(skip_serializing_if = "Option::is_none")]
3473    pub need_name: Option<bool>,
3474    #[serde(skip_serializing_if = "Option::is_none")]
3476    pub need_phone_number: Option<bool>,
3477    #[serde(skip_serializing_if = "Option::is_none")]
3479    pub need_email: Option<bool>,
3480    #[serde(skip_serializing_if = "Option::is_none")]
3482    pub need_shipping_address: Option<bool>,
3483    #[serde(skip_serializing_if = "Option::is_none")]
3485    pub send_phone_number_to_provider: Option<bool>,
3486    #[serde(skip_serializing_if = "Option::is_none")]
3488    pub send_email_to_provider: Option<bool>,
3489    #[serde(skip_serializing_if = "Option::is_none")]
3491    pub is_flexible: Option<bool>,
3492}
3493impl InputInvoiceMessageContent {
3494    pub fn new(
3495        title: String,
3496        description: String,
3497        payload: String,
3498        provider_token: String,
3499        currency: String,
3500        prices: Vec<LabeledPrice>,
3501    ) -> Self {
3502        Self {
3503            title,
3504            description,
3505            payload,
3506            provider_token,
3507            currency,
3508            prices,
3509            max_tip_amount: None,
3510            suggested_tip_amounts: None,
3511            provider_data: None,
3512            photo_url: None,
3513            photo_size: None,
3514            photo_width: None,
3515            photo_height: None,
3516            need_name: None,
3517            need_phone_number: None,
3518            need_email: None,
3519            need_shipping_address: None,
3520            send_phone_number_to_provider: None,
3521            send_email_to_provider: None,
3522            is_flexible: None,
3523        }
3524    }
3525}
3526
3527#[derive(Deserialize, Serialize, Debug, Clone)]
3529pub struct ChosenInlineResult {
3530    pub result_id: String,
3532    pub from: User,
3534    #[serde(skip_serializing_if = "Option::is_none")]
3536    pub location: Option<Location>,
3537    #[serde(skip_serializing_if = "Option::is_none")]
3539    pub inline_message_id: Option<String>,
3540    pub query: String,
3542}
3543impl ChosenInlineResult {
3544    pub fn new(result_id: String, from: User, query: String) -> Self {
3545        Self {
3546            result_id,
3547            from,
3548            location: None,
3549            inline_message_id: None,
3550            query,
3551        }
3552    }
3553}
3554
3555#[derive(Deserialize, Serialize, Debug, Clone)]
3557pub struct SentWebAppMessage {
3558    #[serde(skip_serializing_if = "Option::is_none")]
3560    pub inline_message_id: Option<String>,
3561}
3562impl SentWebAppMessage {
3563    pub fn new() -> Self {
3564        Self {
3565            inline_message_id: None,
3566        }
3567    }
3568}
3569
3570#[derive(Deserialize, Serialize, Debug, Clone)]
3572pub struct LabeledPrice {
3573    pub label: String,
3575    pub amount: i64,
3577}
3578impl LabeledPrice {
3579    pub fn new(label: String, amount: i64) -> Self {
3580        Self { label, amount }
3581    }
3582}
3583
3584#[derive(Deserialize, Serialize, Debug, Clone)]
3586pub struct Invoice {
3587    pub title: String,
3589    pub description: String,
3591    pub start_parameter: String,
3593    pub currency: String,
3595    pub total_amount: i64,
3597}
3598impl Invoice {
3599    pub fn new(
3600        title: String,
3601        description: String,
3602        start_parameter: String,
3603        currency: String,
3604        total_amount: i64,
3605    ) -> Self {
3606        Self {
3607            title,
3608            description,
3609            start_parameter,
3610            currency,
3611            total_amount,
3612        }
3613    }
3614}
3615
3616#[derive(Deserialize, Serialize, Debug, Clone)]
3618pub struct ShippingAddress {
3619    pub country_code: String,
3621    pub state: String,
3623    pub city: String,
3625    pub street_line1: String,
3627    pub street_line2: String,
3629    pub post_code: String,
3631}
3632impl ShippingAddress {
3633    pub fn new(
3634        country_code: String,
3635        state: String,
3636        city: String,
3637        street_line1: String,
3638        street_line2: String,
3639        post_code: String,
3640    ) -> Self {
3641        Self {
3642            country_code,
3643            state,
3644            city,
3645            street_line1,
3646            street_line2,
3647            post_code,
3648        }
3649    }
3650}
3651
3652#[derive(Deserialize, Serialize, Debug, Clone)]
3654pub struct OrderInfo {
3655    #[serde(skip_serializing_if = "Option::is_none")]
3657    pub name: Option<String>,
3658    #[serde(skip_serializing_if = "Option::is_none")]
3660    pub phone_number: Option<String>,
3661    #[serde(skip_serializing_if = "Option::is_none")]
3663    pub email: Option<String>,
3664    #[serde(skip_serializing_if = "Option::is_none")]
3666    pub shipping_address: Option<ShippingAddress>,
3667}
3668impl OrderInfo {
3669    pub fn new() -> Self {
3670        Self {
3671            name: None,
3672            phone_number: None,
3673            email: None,
3674            shipping_address: None,
3675        }
3676    }
3677}
3678
3679#[derive(Deserialize, Serialize, Debug, Clone)]
3681pub struct ShippingOption {
3682    pub id: String,
3684    pub title: String,
3686    pub prices: Vec<LabeledPrice>,
3688}
3689impl ShippingOption {
3690    pub fn new(id: String, title: String, prices: Vec<LabeledPrice>) -> Self {
3691        Self { id, title, prices }
3692    }
3693}
3694
3695#[derive(Deserialize, Serialize, Debug, Clone)]
3697pub struct SuccessfulPayment {
3698    pub currency: String,
3700    pub total_amount: i64,
3702    pub invoice_payload: String,
3704    #[serde(skip_serializing_if = "Option::is_none")]
3706    pub shipping_option_id: Option<String>,
3707    #[serde(skip_serializing_if = "Option::is_none")]
3709    pub order_info: Option<OrderInfo>,
3710    pub telegram_payment_charge_id: String,
3712    pub provider_payment_charge_id: String,
3714}
3715impl SuccessfulPayment {
3716    pub fn new(
3717        currency: String,
3718        total_amount: i64,
3719        invoice_payload: String,
3720        telegram_payment_charge_id: String,
3721        provider_payment_charge_id: String,
3722    ) -> Self {
3723        Self {
3724            currency,
3725            total_amount,
3726            invoice_payload,
3727            shipping_option_id: None,
3728            order_info: None,
3729            telegram_payment_charge_id,
3730            provider_payment_charge_id,
3731        }
3732    }
3733}
3734
3735#[derive(Deserialize, Serialize, Debug, Clone)]
3737pub struct ShippingQuery {
3738    pub id: String,
3740    pub from: User,
3742    pub invoice_payload: String,
3744    pub shipping_address: ShippingAddress,
3746}
3747impl ShippingQuery {
3748    pub fn new(
3749        id: String,
3750        from: User,
3751        invoice_payload: String,
3752        shipping_address: ShippingAddress,
3753    ) -> Self {
3754        Self {
3755            id,
3756            from,
3757            invoice_payload,
3758            shipping_address,
3759        }
3760    }
3761}
3762
3763#[derive(Deserialize, Serialize, Debug, Clone)]
3765pub struct PreCheckoutQuery {
3766    pub id: String,
3768    pub from: User,
3770    pub currency: String,
3772    pub total_amount: i64,
3774    pub invoice_payload: String,
3776    #[serde(skip_serializing_if = "Option::is_none")]
3778    pub shipping_option_id: Option<String>,
3779    #[serde(skip_serializing_if = "Option::is_none")]
3781    pub order_info: Option<OrderInfo>,
3782}
3783impl PreCheckoutQuery {
3784    pub fn new(
3785        id: String,
3786        from: User,
3787        currency: String,
3788        total_amount: i64,
3789        invoice_payload: String,
3790    ) -> Self {
3791        Self {
3792            id,
3793            from,
3794            currency,
3795            total_amount,
3796            invoice_payload,
3797            shipping_option_id: None,
3798            order_info: None,
3799        }
3800    }
3801}
3802
3803#[derive(Deserialize, Serialize, Debug, Clone)]
3805pub struct PassportData {
3806    pub data: Vec<EncryptedPassportElement>,
3808    pub credentials: EncryptedCredentials,
3810}
3811impl PassportData {
3812    pub fn new(data: Vec<EncryptedPassportElement>, credentials: EncryptedCredentials) -> Self {
3813        Self { data, credentials }
3814    }
3815}
3816
3817#[derive(Deserialize, Serialize, Debug, Clone)]
3819pub struct PassportFile {
3820    pub file_id: String,
3822    pub file_unique_id: String,
3824    pub file_size: i64,
3826    pub file_date: i64,
3828}
3829impl PassportFile {
3830    pub fn new(file_id: String, file_unique_id: String, file_size: i64, file_date: i64) -> Self {
3831        Self {
3832            file_id,
3833            file_unique_id,
3834            file_size,
3835            file_date,
3836        }
3837    }
3838}
3839
3840#[derive(Deserialize, Serialize, Debug, Clone)]
3842pub struct EncryptedPassportElement {
3843    #[serde(rename = "type")]
3845    pub type_name: String,
3846    #[serde(skip_serializing_if = "Option::is_none")]
3848    pub data: Option<String>,
3849    #[serde(skip_serializing_if = "Option::is_none")]
3851    pub phone_number: Option<String>,
3852    #[serde(skip_serializing_if = "Option::is_none")]
3854    pub email: Option<String>,
3855    #[serde(skip_serializing_if = "Option::is_none")]
3857    pub files: Option<Vec<PassportFile>>,
3858    #[serde(skip_serializing_if = "Option::is_none")]
3860    pub front_side: Option<PassportFile>,
3861    #[serde(skip_serializing_if = "Option::is_none")]
3863    pub reverse_side: Option<PassportFile>,
3864    #[serde(skip_serializing_if = "Option::is_none")]
3866    pub selfie: Option<PassportFile>,
3867    #[serde(skip_serializing_if = "Option::is_none")]
3869    pub translation: Option<Vec<PassportFile>>,
3870    pub hash: String,
3872}
3873impl EncryptedPassportElement {
3874    pub fn new(type_name: String, hash: String) -> Self {
3875        Self {
3876            type_name,
3877            data: None,
3878            phone_number: None,
3879            email: None,
3880            files: None,
3881            front_side: None,
3882            reverse_side: None,
3883            selfie: None,
3884            translation: None,
3885            hash,
3886        }
3887    }
3888}
3889
3890#[derive(Deserialize, Serialize, Debug, Clone)]
3892pub struct EncryptedCredentials {
3893    pub data: String,
3895    pub hash: String,
3897    pub secret: String,
3899}
3900impl EncryptedCredentials {
3901    pub fn new(data: String, hash: String, secret: String) -> Self {
3902        Self { data, hash, secret }
3903    }
3904}
3905
3906#[derive(Deserialize, Serialize, Debug, Clone)]
3908pub struct PassportElementErrorDataField {
3909    pub source: String,
3911    #[serde(rename = "type")]
3913    pub type_name: String,
3914    pub field_name: String,
3916    pub data_hash: String,
3918    pub message: String,
3920}
3921impl PassportElementErrorDataField {
3922    pub fn new(
3923        source: String,
3924        type_name: String,
3925        field_name: String,
3926        data_hash: String,
3927        message: String,
3928    ) -> Self {
3929        Self {
3930            source,
3931            type_name,
3932            field_name,
3933            data_hash,
3934            message,
3935        }
3936    }
3937}
3938
3939#[derive(Deserialize, Serialize, Debug, Clone)]
3941pub struct PassportElementErrorFrontSide {
3942    pub source: String,
3944    #[serde(rename = "type")]
3946    pub type_name: String,
3947    pub file_hash: String,
3949    pub message: String,
3951}
3952impl PassportElementErrorFrontSide {
3953    pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
3954        Self {
3955            source,
3956            type_name,
3957            file_hash,
3958            message,
3959        }
3960    }
3961}
3962
3963#[derive(Deserialize, Serialize, Debug, Clone)]
3965pub struct PassportElementErrorReverseSide {
3966    pub source: String,
3968    #[serde(rename = "type")]
3970    pub type_name: String,
3971    pub file_hash: String,
3973    pub message: String,
3975}
3976impl PassportElementErrorReverseSide {
3977    pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
3978        Self {
3979            source,
3980            type_name,
3981            file_hash,
3982            message,
3983        }
3984    }
3985}
3986
3987#[derive(Deserialize, Serialize, Debug, Clone)]
3989pub struct PassportElementErrorSelfie {
3990    pub source: String,
3992    #[serde(rename = "type")]
3994    pub type_name: String,
3995    pub file_hash: String,
3997    pub message: String,
3999}
4000impl PassportElementErrorSelfie {
4001    pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
4002        Self {
4003            source,
4004            type_name,
4005            file_hash,
4006            message,
4007        }
4008    }
4009}
4010
4011#[derive(Deserialize, Serialize, Debug, Clone)]
4013pub struct PassportElementErrorFile {
4014    pub source: String,
4016    #[serde(rename = "type")]
4018    pub type_name: String,
4019    pub file_hash: String,
4021    pub message: String,
4023}
4024impl PassportElementErrorFile {
4025    pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
4026        Self {
4027            source,
4028            type_name,
4029            file_hash,
4030            message,
4031        }
4032    }
4033}
4034
4035#[derive(Deserialize, Serialize, Debug, Clone)]
4037pub struct PassportElementErrorFiles {
4038    pub source: String,
4040    #[serde(rename = "type")]
4042    pub type_name: String,
4043    pub file_hashes: Vec<String>,
4045    pub message: String,
4047}
4048impl PassportElementErrorFiles {
4049    pub fn new(
4050        source: String,
4051        type_name: String,
4052        file_hashes: Vec<String>,
4053        message: String,
4054    ) -> Self {
4055        Self {
4056            source,
4057            type_name,
4058            file_hashes,
4059            message,
4060        }
4061    }
4062}
4063
4064#[derive(Deserialize, Serialize, Debug, Clone)]
4066pub struct PassportElementErrorTranslationFile {
4067    pub source: String,
4069    #[serde(rename = "type")]
4071    pub type_name: String,
4072    pub file_hash: String,
4074    pub message: String,
4076}
4077impl PassportElementErrorTranslationFile {
4078    pub fn new(source: String, type_name: String, file_hash: String, message: String) -> Self {
4079        Self {
4080            source,
4081            type_name,
4082            file_hash,
4083            message,
4084        }
4085    }
4086}
4087
4088#[derive(Deserialize, Serialize, Debug, Clone)]
4090pub struct PassportElementErrorTranslationFiles {
4091    pub source: String,
4093    #[serde(rename = "type")]
4095    pub type_name: String,
4096    pub file_hashes: Vec<String>,
4098    pub message: String,
4100}
4101impl PassportElementErrorTranslationFiles {
4102    pub fn new(
4103        source: String,
4104        type_name: String,
4105        file_hashes: Vec<String>,
4106        message: String,
4107    ) -> Self {
4108        Self {
4109            source,
4110            type_name,
4111            file_hashes,
4112            message,
4113        }
4114    }
4115}
4116
4117#[derive(Deserialize, Serialize, Debug, Clone)]
4119pub struct PassportElementErrorUnspecified {
4120    pub source: String,
4122    #[serde(rename = "type")]
4124    pub type_name: String,
4125    pub element_hash: String,
4127    pub message: String,
4129}
4130impl PassportElementErrorUnspecified {
4131    pub fn new(source: String, type_name: String, element_hash: String, message: String) -> Self {
4132        Self {
4133            source,
4134            type_name,
4135            element_hash,
4136            message,
4137        }
4138    }
4139}
4140
4141#[derive(Deserialize, Serialize, Debug, Clone)]
4143pub struct Game {
4144    pub title: String,
4146    pub description: String,
4148    pub photo: Vec<PhotoSize>,
4150    #[serde(skip_serializing_if = "Option::is_none")]
4152    pub text: Option<String>,
4153    #[serde(skip_serializing_if = "Option::is_none")]
4155    pub text_entities: Option<Vec<MessageEntity>>,
4156    #[serde(skip_serializing_if = "Option::is_none")]
4158    pub animation: Option<Animation>,
4159}
4160impl Game {
4161    pub fn new(title: String, description: String, photo: Vec<PhotoSize>) -> Self {
4162        Self {
4163            title,
4164            description,
4165            photo,
4166            text: None,
4167            text_entities: None,
4168            animation: None,
4169        }
4170    }
4171}
4172
4173#[derive(Deserialize, Serialize, Debug, Clone)]
4175pub struct CallbackGame {}
4176impl CallbackGame {
4177    pub fn new() -> Self {
4178        Self {}
4179    }
4180}
4181
4182#[derive(Deserialize, Serialize, Debug, Clone)]
4184pub struct GameHighScore {
4185    pub position: i64,
4187    pub user: User,
4189    pub score: i64,
4191}
4192impl GameHighScore {
4193    pub fn new(position: i64, user: User, score: i64) -> Self {
4194        Self {
4195            position,
4196            user,
4197            score,
4198        }
4199    }
4200}
4201
4202pub type Params = HashMap<String, Value>;
4204
4205#[derive(Deserialize, Serialize, Debug, Clone)]
4207#[serde(untagged)]
4208pub enum ChatId {
4209    IntType(i64),
4211    StringType(String),
4213}
4214
4215#[derive(Deserialize, Serialize, Debug, Clone)]
4217#[serde(untagged)]
4218pub enum InputFile {
4219    FileID(String),
4221    FileURL(String),
4223    FileAttach(String),
4225    FileBytes(String, Vec<u8>),
4227    FilePath(String),
4229}
4230
4231pub enum InputFileResult {
4233    Text(String),
4235    Part(reqwest::multipart::Part),
4237}
4238
4239impl InputFile {
4240    pub fn need_upload(&self) -> bool {
4241        matches!(self, InputFile::FileBytes(_, _) | InputFile::FilePath(_))
4242    }
4243
4244    pub async fn data(&self) -> Result<InputFileResult, Box<dyn std::error::Error>> {
4245        match self {
4246            InputFile::FileID(id) => Ok(InputFileResult::Text(id.clone())),
4247            InputFile::FileURL(url) => Ok(InputFileResult::Text(url.clone())),
4248            InputFile::FileAttach(attach) => Ok(InputFileResult::Text(attach.clone())),
4249            InputFile::FileBytes(file_name, bytes) => Ok(InputFileResult::Part(
4250                reqwest::multipart::Part::bytes(bytes.clone()).file_name(file_name.to_string()),
4251            )),
4252            InputFile::FilePath(path) => Ok(InputFileResult::Part(
4253                reqwest::multipart::Part::stream(reqwest::Body::wrap_stream(
4254                    tokio_util::codec::FramedRead::new(
4255                        tokio::fs::File::open(path).await?,
4256                        tokio_util::codec::BytesCodec::new(),
4257                    ),
4258                ))
4259                .file_name(path.to_string()),
4260            )),
4261        }
4262    }
4263}
4264
4265#[derive(Deserialize, Serialize, Debug, Clone)]
4267#[serde(untagged)]
4268pub enum ReplyMarkup {
4269    InlineKeyboardMarkup(InlineKeyboardMarkup),
4270    ReplyKeyboardMarkup(ReplyKeyboardMarkup),
4271    ReplyKeyboardRemove(ReplyKeyboardRemove),
4272    ForceReply(ForceReply),
4273}
4274#[derive(Deserialize, Serialize, Debug, Clone)]
4284#[serde(tag = "status")]
4285pub enum ChatMember {
4286    #[serde(rename = "creator")]
4287    ChatMemberOwner(ChatMemberOwner),
4288    #[serde(rename = "administrator")]
4289    ChatMemberAdministrator(ChatMemberAdministrator),
4290    #[serde(rename = "member")]
4291    ChatMemberMember(ChatMemberMember),
4292    #[serde(rename = "restricted")]
4293    ChatMemberRestricted(ChatMemberRestricted),
4294    #[serde(rename = "left")]
4295    ChatMemberLeft(ChatMemberLeft),
4296    #[serde(rename = "kicked")]
4297    ChatMemberBanned(ChatMemberBanned),
4298}
4299
4300#[derive(Deserialize, Serialize, Debug, Clone)]
4311#[serde(tag = "type")]
4312pub enum BotCommandScope {
4313    #[serde(rename = "default")]
4314    BotCommandScopeDefault(BotCommandScopeDefault),
4315    #[serde(rename = "all_private_chats")]
4316    BotCommandScopeAllPrivateChats(BotCommandScopeAllPrivateChats),
4317    #[serde(rename = "all_group_chats")]
4318    BotCommandScopeAllGroupChats(BotCommandScopeAllGroupChats),
4319    #[serde(rename = "all_chat_administrators")]
4320    BotCommandScopeAllChatAdministrators(BotCommandScopeAllChatAdministrators),
4321    #[serde(rename = "chat")]
4322    BotCommandScopeChat(BotCommandScopeChat),
4323    #[serde(rename = "chat_administrators")]
4324    BotCommandScopeChatAdministrators(BotCommandScopeChatAdministrators),
4325    #[serde(rename = "chat_member")]
4326    BotCommandScopeChatMember(BotCommandScopeChatMember),
4327}
4328
4329#[derive(Deserialize, Serialize, Debug, Clone)]
4337#[serde(tag = "type")]
4338pub enum MenuButton {
4339    #[serde(rename = "commands")]
4340    MenuButtonCommands(MenuButtonCommands),
4341    #[serde(rename = "web_app")]
4342    MenuButtonWebApp(MenuButtonWebApp),
4343    #[serde(rename = "default")]
4344    MenuButtonDefault(MenuButtonDefault),
4345}
4346
4347#[derive(Deserialize, Serialize, Debug, Clone)]
4356#[serde(tag = "type")]
4357pub enum InputMedia {
4358    #[serde(rename = "animation")]
4359    InputMediaAnimation(InputMediaAnimation),
4360    #[serde(rename = "document")]
4361    InputMediaDocument(InputMediaDocument),
4362    #[serde(rename = "audio")]
4363    InputMediaAudio(InputMediaAudio),
4364    #[serde(rename = "photo")]
4365    InputMediaPhoto(InputMediaPhoto),
4366    #[serde(rename = "video")]
4367    InputMediaVideo(InputMediaVideo),
4368}
4369
4370impl InputMedia {
4371    pub fn prepare_input_media_param(&self, idx: i32) -> Self {
4382        match self {
4383            InputMedia::InputMediaAnimation(animation) => {
4384                let mut media = animation.media.clone();
4385                if media.need_upload() {
4386                    media = Self::attach_file(idx);
4387                }
4388                let mut thumb: Option<InputFile> = None;
4389                if let Some(some_thumb) = &animation.thumb {
4390                    if some_thumb.need_upload() {
4391                        thumb = Some(Self::attach_thumb_file(idx));
4392                    }
4393                }
4394                Self::InputMediaAnimation(InputMediaAnimation {
4395                    media,
4396                    thumb,
4397                    ..animation.clone()
4398                })
4399            }
4400            InputMedia::InputMediaDocument(document) => {
4401                let mut media = document.media.clone();
4402                if media.need_upload() {
4403                    media = Self::attach_file(idx);
4404                }
4405                let mut thumb: Option<InputFile> = None;
4406                if let Some(some_thumb) = &document.thumb {
4407                    if some_thumb.need_upload() {
4408                        thumb = Some(Self::attach_thumb_file(idx));
4409                    }
4410                }
4411                Self::InputMediaDocument(InputMediaDocument {
4412                    media,
4413                    thumb,
4414                    ..document.clone()
4415                })
4416            }
4417            InputMedia::InputMediaAudio(audio) => {
4418                let mut media = audio.media.clone();
4419                if media.need_upload() {
4420                    media = Self::attach_file(idx);
4421                }
4422                let mut thumb: Option<InputFile> = None;
4423                if let Some(some_thumb) = &audio.thumb {
4424                    if some_thumb.need_upload() {
4425                        thumb = Some(Self::attach_thumb_file(idx));
4426                    }
4427                }
4428                Self::InputMediaAudio(InputMediaAudio {
4429                    media,
4430                    thumb,
4431                    ..audio.clone()
4432                })
4433            }
4434            InputMedia::InputMediaPhoto(photo) => {
4435                if !photo.media.need_upload() {
4436                    return self.clone();
4437                }
4438                Self::InputMediaPhoto(InputMediaPhoto {
4439                    media: Self::attach_file(idx),
4440                    ..photo.clone()
4441                })
4442            }
4443            InputMedia::InputMediaVideo(video) => {
4444                let mut media = video.media.clone();
4445                if media.need_upload() {
4446                    media = Self::attach_file(idx);
4447                }
4448                let mut thumb: Option<InputFile> = None;
4449                if let Some(some_thumb) = &video.thumb {
4450                    if some_thumb.need_upload() {
4451                        thumb = Some(Self::attach_thumb_file(idx));
4452                    }
4453                }
4454                Self::InputMediaVideo(InputMediaVideo {
4455                    media,
4456                    thumb,
4457                    ..video.clone()
4458                })
4459            }
4460        }
4461    }
4462
4463    pub fn prepare_input_media_file(&self, idx: i32) -> Vec<(String, InputFile)> {
4472        let mut result: Vec<(String, InputFile)> = Vec::new();
4473        match self {
4474            InputMedia::InputMediaAnimation(animation) => {
4475                let media = animation.media.clone();
4476                if media.need_upload() {
4477                    result.push((Self::attach_file_name(idx), media.clone()));
4478                }
4479                if let Some(thumb) = &animation.thumb {
4480                    if thumb.need_upload() {
4481                        result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4482                    }
4483                }
4484            }
4485            InputMedia::InputMediaDocument(document) => {
4486                let media = document.media.clone();
4487                if media.need_upload() {
4488                    result.push((Self::attach_file_name(idx), media.clone()));
4489                }
4490                if let Some(thumb) = &document.thumb {
4491                    if thumb.need_upload() {
4492                        result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4493                    }
4494                }
4495            }
4496            InputMedia::InputMediaAudio(audio) => {
4497                let media = audio.media.clone();
4498                if media.need_upload() {
4499                    result.push((Self::attach_file_name(idx), media.clone()));
4500                }
4501                if let Some(thumb) = &audio.thumb {
4502                    if thumb.need_upload() {
4503                        result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4504                    }
4505                }
4506            }
4507            InputMedia::InputMediaPhoto(photo) => {
4508                if photo.media.need_upload() {
4509                    result.push((Self::attach_file_name(idx), photo.media.clone()));
4510                }
4511            }
4512            InputMedia::InputMediaVideo(video) => {
4513                let media = video.media.clone();
4514                if media.need_upload() {
4515                    result.push((Self::attach_file_name(idx), media.clone()));
4516                }
4517                if let Some(thumb) = &video.thumb {
4518                    if thumb.need_upload() {
4519                        result.push((Self::attach_thumb_file_name(idx), thumb.clone()));
4520                    }
4521                }
4522            }
4523        }
4524        result
4525    }
4526
4527    fn attach_file_name(idx: i32) -> String {
4528        format!("file-{}", idx)
4529    }
4530
4531    fn attach_thumb_file_name(idx: i32) -> String {
4532        format!("file-{}-thumb", idx)
4533    }
4534
4535    fn attach_file(idx: i32) -> InputFile {
4536        InputFile::FileAttach(format!("attach://file-{}", idx))
4537    }
4538
4539    fn attach_thumb_file(idx: i32) -> InputFile {
4540        InputFile::FileAttach(format!("attach://file-{}-thumb", idx))
4541    }
4542}
4543
4544#[derive(Deserialize, Serialize, Debug, Clone)]
4546#[serde(untagged)]
4547pub enum MayBeMessage {
4548    Message(Message),
4549    Bool(bool),
4550}
4551
4552impl Chat {
4553    pub fn new_private(id: i64) -> Self {
4554        Self::new(id, ChatType::Private)
4555    }
4556    pub fn new_group(id: i64) -> Self {
4557        Self::new(id, ChatType::Group)
4558    }
4559    pub fn new_super_group(id: i64) -> Self {
4560        Self::new(id, ChatType::Supergroup)
4561    }
4562    pub fn new_channel(id: i64) -> Self {
4563        Self::new(id, ChatType::Channel)
4564    }
4565    pub fn is_private(&self) -> bool {
4566        matches!(self.type_name, ChatType::Private)
4567    }
4568    pub fn is_group(&self) -> bool {
4569        matches!(self.type_name, ChatType::Group)
4570    }
4571    pub fn is_super_group(&self) -> bool {
4572        matches!(self.type_name, ChatType::Supergroup)
4573    }
4574    pub fn is_channel(&self) -> bool {
4575        matches!(self.type_name, ChatType::Channel)
4576    }
4577}
4578
4579impl MessageEntity {
4580    pub fn new_mention(offset: i64, length: i64) -> Self {
4581        Self::new("mention".to_string(), offset, length)
4582    }
4583    pub fn new_hashtag(offset: i64, length: i64) -> Self {
4584        Self::new("hashtag".to_string(), offset, length)
4585    }
4586    pub fn new_cashtag(offset: i64, length: i64) -> Self {
4587        Self::new("cashtag".to_string(), offset, length)
4588    }
4589    pub fn new_bot_command(offset: i64, length: i64) -> Self {
4590        Self::new("bot_command".to_string(), offset, length)
4591    }
4592    pub fn new_url(offset: i64, length: i64) -> Self {
4593        Self::new("url".to_string(), offset, length)
4594    }
4595    pub fn new_email(offset: i64, length: i64) -> Self {
4596        Self::new("email".to_string(), offset, length)
4597    }
4598    pub fn new_phone_number(offset: i64, length: i64) -> Self {
4599        Self::new("phone_number".to_string(), offset, length)
4600    }
4601    pub fn new_bold(offset: i64, length: i64) -> Self {
4602        Self::new("bold".to_string(), offset, length)
4603    }
4604    pub fn new_italic(offset: i64, length: i64) -> Self {
4605        Self::new("italic".to_string(), offset, length)
4606    }
4607    pub fn new_underline(offset: i64, length: i64) -> Self {
4608        Self::new("underline".to_string(), offset, length)
4609    }
4610    pub fn new_strikethrough(offset: i64, length: i64) -> Self {
4611        Self::new("strikethrough".to_string(), offset, length)
4612    }
4613    pub fn new_code(offset: i64, length: i64) -> Self {
4614        Self::new("code".to_string(), offset, length)
4615    }
4616    pub fn new_pre(offset: i64, length: i64) -> Self {
4617        Self::new("pre".to_string(), offset, length)
4618    }
4619    pub fn new_text_link(offset: i64, length: i64) -> Self {
4620        Self::new("text_link".to_string(), offset, length)
4621    }
4622    pub fn new_text_mention(offset: i64, length: i64) -> Self {
4623        Self::new("text_mention".to_string(), offset, length)
4624    }
4625}
4626
4627impl Sticker {
4628    pub fn new_regular(
4629        file_id: String,
4630        file_unique_id: String,
4631        width: i64,
4632        height: i64,
4633        is_animated: bool,
4634        is_video: bool,
4635    ) -> Self {
4636        Self::new(
4637            file_id,
4638            file_unique_id,
4639            "regular".to_string(),
4640            width,
4641            height,
4642            is_animated,
4643            is_video,
4644        )
4645    }
4646    pub fn new_mask(
4647        file_id: String,
4648        file_unique_id: String,
4649        width: i64,
4650        height: i64,
4651        is_animated: bool,
4652        is_video: bool,
4653    ) -> Self {
4654        Self::new(
4655            file_id,
4656            file_unique_id,
4657            "mask".to_string(),
4658            width,
4659            height,
4660            is_animated,
4661            is_video,
4662        )
4663    }
4664    pub fn new_custom_emoji(
4665        file_id: String,
4666        file_unique_id: String,
4667        width: i64,
4668        height: i64,
4669        is_animated: bool,
4670        is_video: bool,
4671    ) -> Self {
4672        Self::new(
4673            file_id,
4674            file_unique_id,
4675            "custom_emoji".to_string(),
4676            width,
4677            height,
4678            is_animated,
4679            is_video,
4680        )
4681    }
4682}
4683
4684impl PassportElementErrorDataField {
4685    pub fn new_personal_details(
4686        source: String,
4687        field_name: String,
4688        data_hash: String,
4689        message: String,
4690    ) -> Self {
4691        Self::new(
4692            source,
4693            "personal_details".to_string(),
4694            field_name,
4695            data_hash,
4696            message,
4697        )
4698    }
4699    pub fn new_passport(
4700        source: String,
4701        field_name: String,
4702        data_hash: String,
4703        message: String,
4704    ) -> Self {
4705        Self::new(
4706            source,
4707            "passport".to_string(),
4708            field_name,
4709            data_hash,
4710            message,
4711        )
4712    }
4713    pub fn new_driver_license(
4714        source: String,
4715        field_name: String,
4716        data_hash: String,
4717        message: String,
4718    ) -> Self {
4719        Self::new(
4720            source,
4721            "driver_license".to_string(),
4722            field_name,
4723            data_hash,
4724            message,
4725        )
4726    }
4727    pub fn new_identity_card(
4728        source: String,
4729        field_name: String,
4730        data_hash: String,
4731        message: String,
4732    ) -> Self {
4733        Self::new(
4734            source,
4735            "identity_card".to_string(),
4736            field_name,
4737            data_hash,
4738            message,
4739        )
4740    }
4741    pub fn new_internal_passport(
4742        source: String,
4743        field_name: String,
4744        data_hash: String,
4745        message: String,
4746    ) -> Self {
4747        Self::new(
4748            source,
4749            "internal_passport".to_string(),
4750            field_name,
4751            data_hash,
4752            message,
4753        )
4754    }
4755    pub fn new_address(
4756        source: String,
4757        field_name: String,
4758        data_hash: String,
4759        message: String,
4760    ) -> Self {
4761        Self::new(
4762            source,
4763            "address".to_string(),
4764            field_name,
4765            data_hash,
4766            message,
4767        )
4768    }
4769}
4770
4771impl PassportElementErrorFrontSide {
4772    pub fn new_passport(source: String, file_hash: String, message: String) -> Self {
4773        Self::new(source, "passport".to_string(), file_hash, message)
4774    }
4775    pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4776        Self::new(source, "driver_license".to_string(), file_hash, message)
4777    }
4778    pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4779        Self::new(source, "identity_card".to_string(), file_hash, message)
4780    }
4781    pub fn new_internal_passport(source: String, file_hash: String, message: String) -> Self {
4782        Self::new(source, "internal_passport".to_string(), file_hash, message)
4783    }
4784}
4785
4786impl PassportElementErrorReverseSide {
4787    pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4788        Self::new(source, "driver_license".to_string(), file_hash, message)
4789    }
4790    pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4791        Self::new(source, "identity_card".to_string(), file_hash, message)
4792    }
4793}
4794
4795impl PassportElementErrorSelfie {
4796    pub fn new_passport(source: String, file_hash: String, message: String) -> Self {
4797        Self::new(source, "passport".to_string(), file_hash, message)
4798    }
4799    pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4800        Self::new(source, "driver_license".to_string(), file_hash, message)
4801    }
4802    pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4803        Self::new(source, "identity_card".to_string(), file_hash, message)
4804    }
4805    pub fn new_internal_passport(source: String, file_hash: String, message: String) -> Self {
4806        Self::new(source, "internal_passport".to_string(), file_hash, message)
4807    }
4808}
4809
4810impl PassportElementErrorFile {
4811    pub fn new_utility_bill(source: String, file_hash: String, message: String) -> Self {
4812        Self::new(source, "utility_bill".to_string(), file_hash, message)
4813    }
4814    pub fn new_bank_statement(source: String, file_hash: String, message: String) -> Self {
4815        Self::new(source, "bank_statement".to_string(), file_hash, message)
4816    }
4817    pub fn new_rental_agreement(source: String, file_hash: String, message: String) -> Self {
4818        Self::new(source, "rental_agreement".to_string(), file_hash, message)
4819    }
4820    pub fn new_passport_registration(source: String, file_hash: String, message: String) -> Self {
4821        Self::new(
4822            source,
4823            "passport_registration".to_string(),
4824            file_hash,
4825            message,
4826        )
4827    }
4828    pub fn new_temporary_registration(source: String, file_hash: String, message: String) -> Self {
4829        Self::new(
4830            source,
4831            "temporary_registration".to_string(),
4832            file_hash,
4833            message,
4834        )
4835    }
4836}
4837
4838impl PassportElementErrorFiles {
4839    pub fn new_utility_bill(source: String, file_hashes: Vec<String>, message: String) -> Self {
4840        Self::new(source, "utility_bill".to_string(), file_hashes, message)
4841    }
4842    pub fn new_bank_statement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4843        Self::new(source, "bank_statement".to_string(), file_hashes, message)
4844    }
4845    pub fn new_rental_agreement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4846        Self::new(source, "rental_agreement".to_string(), file_hashes, message)
4847    }
4848    pub fn new_passport_registration(
4849        source: String,
4850        file_hashes: Vec<String>,
4851        message: String,
4852    ) -> Self {
4853        Self::new(
4854            source,
4855            "passport_registration".to_string(),
4856            file_hashes,
4857            message,
4858        )
4859    }
4860    pub fn new_temporary_registration(
4861        source: String,
4862        file_hashes: Vec<String>,
4863        message: String,
4864    ) -> Self {
4865        Self::new(
4866            source,
4867            "temporary_registration".to_string(),
4868            file_hashes,
4869            message,
4870        )
4871    }
4872}
4873
4874impl PassportElementErrorTranslationFile {
4875    pub fn new_passport(source: String, file_hash: String, message: String) -> Self {
4876        Self::new(source, "passport".to_string(), file_hash, message)
4877    }
4878    pub fn new_driver_license(source: String, file_hash: String, message: String) -> Self {
4879        Self::new(source, "driver_license".to_string(), file_hash, message)
4880    }
4881    pub fn new_identity_card(source: String, file_hash: String, message: String) -> Self {
4882        Self::new(source, "identity_card".to_string(), file_hash, message)
4883    }
4884    pub fn new_internal_passport(source: String, file_hash: String, message: String) -> Self {
4885        Self::new(source, "internal_passport".to_string(), file_hash, message)
4886    }
4887    pub fn new_utility_bill(source: String, file_hash: String, message: String) -> Self {
4888        Self::new(source, "utility_bill".to_string(), file_hash, message)
4889    }
4890    pub fn new_bank_statement(source: String, file_hash: String, message: String) -> Self {
4891        Self::new(source, "bank_statement".to_string(), file_hash, message)
4892    }
4893    pub fn new_rental_agreement(source: String, file_hash: String, message: String) -> Self {
4894        Self::new(source, "rental_agreement".to_string(), file_hash, message)
4895    }
4896    pub fn new_passport_registration(source: String, file_hash: String, message: String) -> Self {
4897        Self::new(
4898            source,
4899            "passport_registration".to_string(),
4900            file_hash,
4901            message,
4902        )
4903    }
4904    pub fn new_temporary_registration(source: String, file_hash: String, message: String) -> Self {
4905        Self::new(
4906            source,
4907            "temporary_registration".to_string(),
4908            file_hash,
4909            message,
4910        )
4911    }
4912}
4913
4914impl PassportElementErrorTranslationFiles {
4915    pub fn new_passport(source: String, file_hashes: Vec<String>, message: String) -> Self {
4916        Self::new(source, "passport".to_string(), file_hashes, message)
4917    }
4918    pub fn new_driver_license(source: String, file_hashes: Vec<String>, message: String) -> Self {
4919        Self::new(source, "driver_license".to_string(), file_hashes, message)
4920    }
4921    pub fn new_identity_card(source: String, file_hashes: Vec<String>, message: String) -> Self {
4922        Self::new(source, "identity_card".to_string(), file_hashes, message)
4923    }
4924    pub fn new_internal_passport(
4925        source: String,
4926        file_hashes: Vec<String>,
4927        message: String,
4928    ) -> Self {
4929        Self::new(
4930            source,
4931            "internal_passport".to_string(),
4932            file_hashes,
4933            message,
4934        )
4935    }
4936    pub fn new_utility_bill(source: String, file_hashes: Vec<String>, message: String) -> Self {
4937        Self::new(source, "utility_bill".to_string(), file_hashes, message)
4938    }
4939    pub fn new_bank_statement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4940        Self::new(source, "bank_statement".to_string(), file_hashes, message)
4941    }
4942    pub fn new_rental_agreement(source: String, file_hashes: Vec<String>, message: String) -> Self {
4943        Self::new(source, "rental_agreement".to_string(), file_hashes, message)
4944    }
4945    pub fn new_passport_registration(
4946        source: String,
4947        file_hashes: Vec<String>,
4948        message: String,
4949    ) -> Self {
4950        Self::new(
4951            source,
4952            "passport_registration".to_string(),
4953            file_hashes,
4954            message,
4955        )
4956    }
4957    pub fn new_temporary_registration(
4958        source: String,
4959        file_hashes: Vec<String>,
4960        message: String,
4961    ) -> Self {
4962        Self::new(
4963            source,
4964            "temporary_registration".to_string(),
4965            file_hashes,
4966            message,
4967        )
4968    }
4969}
4970
4971#[derive(Deserialize, Serialize, Debug, Clone)]
4980#[serde(untagged)]
4981pub enum InputMessageContent {
4982    InputTextMessageContent(InputTextMessageContent),
4983    InputLocationMessageContent(InputLocationMessageContent),
4984    InputVenueMessageContent(InputVenueMessageContent),
4985    InputContactMessageContent(InputContactMessageContent),
4986    InputInvoiceMessageContent(InputInvoiceMessageContent),
4987}
4988
4989#[derive(Deserialize, Serialize, Debug, Clone)]
5002pub enum PassportElementError {
5003    PassportElementErrorDataField(PassportElementErrorDataField),
5004    PassportElementErrorFrontSide(PassportElementErrorFrontSide),
5005    PassportElementErrorReverseSide(PassportElementErrorReverseSide),
5006    PassportElementErrorSelfie(PassportElementErrorSelfie),
5007    PassportElementErrorFile(PassportElementErrorFile),
5008    PassportElementErrorFiles(PassportElementErrorFiles),
5009    PassportElementErrorTranslationFile(PassportElementErrorTranslationFile),
5010    PassportElementErrorTranslationFiles(PassportElementErrorTranslationFiles),
5011    PassportElementErrorUnspecified(PassportElementErrorUnspecified),
5012}
5013
5014#[derive(Deserialize, Serialize, Debug, Clone)]
5038#[serde(tag = "type")]
5039pub enum InlineQueryResult {
5040    #[serde(rename = "audio")]
5041    InlineQueryResultCachedAudio(InlineQueryResultCachedAudio),
5042    #[serde(rename = "document")]
5043    InlineQueryResultCachedDocument(InlineQueryResultCachedDocument),
5044    #[serde(rename = "gif")]
5045    InlineQueryResultCachedGif(InlineQueryResultCachedGif),
5046    #[serde(rename = "mpeg4_gif")]
5047    InlineQueryResultCachedMpeg4Gif(InlineQueryResultCachedMpeg4Gif),
5048    #[serde(rename = "photo")]
5049    InlineQueryResultCachedPhoto(InlineQueryResultCachedPhoto),
5050    #[serde(rename = "sticker")]
5051    InlineQueryResultCachedSticker(InlineQueryResultCachedSticker),
5052    #[serde(rename = "video")]
5053    InlineQueryResultCachedVideo(InlineQueryResultCachedVideo),
5054    #[serde(rename = "voice")]
5055    InlineQueryResultCachedVoice(InlineQueryResultCachedVoice),
5056    #[serde(rename = "article")]
5057    InlineQueryResultArticle(InlineQueryResultArticle),
5058    #[serde(rename = "audio")]
5059    InlineQueryResultAudio(InlineQueryResultAudio),
5060    #[serde(rename = "contact")]
5061    InlineQueryResultContact(InlineQueryResultContact),
5062    #[serde(rename = "game")]
5063    InlineQueryResultGame(InlineQueryResultGame),
5064    #[serde(rename = "document")]
5065    InlineQueryResultDocument(InlineQueryResultDocument),
5066    #[serde(rename = "gif")]
5067    InlineQueryResultGif(InlineQueryResultGif),
5068    #[serde(rename = "location")]
5069    InlineQueryResultLocation(InlineQueryResultLocation),
5070    #[serde(rename = "mpeg4_gif")]
5071    InlineQueryResultMpeg4Gif(InlineQueryResultMpeg4Gif),
5072    #[serde(rename = "photo")]
5073    InlineQueryResultPhoto(InlineQueryResultPhoto),
5074    #[serde(rename = "venue")]
5075    InlineQueryResultVenue(InlineQueryResultVenue),
5076    #[serde(rename = "video")]
5077    InlineQueryResultVideo(InlineQueryResultVideo),
5078    #[serde(rename = "voice")]
5079    InlineQueryResultVoice(InlineQueryResultVoice),
5080}