1use crate::chat::Location;
2use crate::user::User;
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct InlineQuery {
11 pub id: String,
13 pub from: User,
15 pub query: String,
17 pub offset: String,
19 #[serde(skip_serializing_if = "Option::is_none")]
21 pub chat_type: Option<String>,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub location: Option<Location>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
32pub struct ChosenInlineResult {
33 pub result_id: String,
35 pub from: User,
37 #[serde(skip_serializing_if = "Option::is_none")]
39 pub location: Option<Location>,
40 #[serde(skip_serializing_if = "Option::is_none")]
42 pub inline_message_id: Option<String>,
43 pub query: String,
45}
46
47#[derive(Debug, Clone, Serialize)]
48#[serde(tag = "type", rename_all = "snake_case")]
49pub enum InlineQueryResult {
64 Article(InlineQueryResultArticle),
66 Photo(InlineQueryResultPhoto),
68 Gif(InlineQueryResultGif),
70 Mpeg4Gif(InlineQueryResultMpeg4Gif),
72 Video(InlineQueryResultVideo),
74 Audio(InlineQueryResultAudio),
76 Voice(InlineQueryResultVoice),
78 Document(InlineQueryResultDocument),
80 Location(InlineQueryResultLocation),
82 Venue(InlineQueryResultVenue),
84 Contact(InlineQueryResultContact),
86 Game(InlineQueryResultGame),
88 #[serde(rename = "photo")]
90 CachedPhoto(InlineQueryResultCachedPhoto),
91 #[serde(rename = "gif")]
93 CachedGif(InlineQueryResultCachedGif),
94 #[serde(rename = "mpeg4_gif")]
96 CachedMpeg4Gif(InlineQueryResultCachedMpeg4Gif),
97 #[serde(rename = "sticker")]
99 CachedSticker(InlineQueryResultCachedSticker),
100 #[serde(rename = "document")]
102 CachedDocument(InlineQueryResultCachedDocument),
103 #[serde(rename = "video")]
105 CachedVideo(InlineQueryResultCachedVideo),
106 #[serde(rename = "voice")]
108 CachedVoice(InlineQueryResultCachedVoice),
109 #[serde(rename = "audio")]
111 CachedAudio(InlineQueryResultCachedAudio),
112}
113
114impl<'de> Deserialize<'de> for InlineQueryResult {
117 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
126 where
127 D: serde::Deserializer<'de>,
128 {
129 use serde::de::Error as _;
130
131 let value = serde_json::Value::deserialize(deserializer)?;
132 let tag = value
133 .get("type")
134 .and_then(serde_json::Value::as_str)
135 .ok_or_else(|| D::Error::custom("InlineQueryResult is missing its `type` field"))?
136 .to_owned();
137 let cached = |field: &str| value.get(field).is_some();
138
139 macro_rules! into {
140 ($variant:ident, $ty:ty) => {
141 <$ty>::deserialize(value)
142 .map(InlineQueryResult::$variant)
143 .map_err(D::Error::custom)
144 };
145 }
146
147 match tag.as_str() {
148 "article" => into!(Article, InlineQueryResultArticle),
149 "location" => into!(Location, InlineQueryResultLocation),
150 "venue" => into!(Venue, InlineQueryResultVenue),
151 "contact" => into!(Contact, InlineQueryResultContact),
152 "game" => into!(Game, InlineQueryResultGame),
153 "sticker" => into!(CachedSticker, InlineQueryResultCachedSticker),
155
156 "photo" if cached("photo_file_id") => into!(CachedPhoto, InlineQueryResultCachedPhoto),
157 "photo" => into!(Photo, InlineQueryResultPhoto),
158 "gif" if cached("gif_file_id") => into!(CachedGif, InlineQueryResultCachedGif),
159 "gif" => into!(Gif, InlineQueryResultGif),
160 "mpeg4_gif" if cached("mpeg4_file_id") => {
161 into!(CachedMpeg4Gif, InlineQueryResultCachedMpeg4Gif)
162 }
163 "mpeg4_gif" => into!(Mpeg4Gif, InlineQueryResultMpeg4Gif),
164 "video" if cached("video_file_id") => into!(CachedVideo, InlineQueryResultCachedVideo),
165 "video" => into!(Video, InlineQueryResultVideo),
166 "audio" if cached("audio_file_id") => into!(CachedAudio, InlineQueryResultCachedAudio),
167 "audio" => into!(Audio, InlineQueryResultAudio),
168 "voice" if cached("voice_file_id") => into!(CachedVoice, InlineQueryResultCachedVoice),
169 "voice" => into!(Voice, InlineQueryResultVoice),
170 "document" if cached("document_file_id") => {
171 into!(CachedDocument, InlineQueryResultCachedDocument)
172 }
173 "document" => into!(Document, InlineQueryResultDocument),
174
175 other => Err(D::Error::custom(format!(
178 "unknown variant `{other}`, expected a valid InlineQueryResult type"
179 ))),
180 }
181 }
182}
183
184#[derive(Debug, Clone, Serialize, Deserialize)]
186pub struct InlineQueryResultArticle {
187 pub id: String,
189 pub title: String,
191 pub input_message_content: InputMessageContent,
193 #[serde(skip_serializing_if = "Option::is_none")]
195 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub url: Option<String>,
199 #[serde(skip_serializing_if = "Option::is_none")]
201 pub description: Option<String>,
202 #[serde(skip_serializing_if = "Option::is_none")]
204 pub thumbnail_url: Option<String>,
205 #[serde(skip_serializing_if = "Option::is_none")]
207 pub thumbnail_width: Option<u32>,
208 #[serde(skip_serializing_if = "Option::is_none")]
210 pub thumbnail_height: Option<u32>,
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct InlineQueryResultPhoto {
217 pub id: String,
219 pub photo_url: String,
221 pub thumbnail_url: String,
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub photo_width: Option<u32>,
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub photo_height: Option<u32>,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub title: Option<String>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub description: Option<String>,
235 #[serde(skip_serializing_if = "Option::is_none")]
237 pub caption: Option<String>,
238 #[serde(skip_serializing_if = "Option::is_none")]
240 pub parse_mode: Option<crate::message::ParseMode>,
241 #[serde(skip_serializing_if = "Option::is_none")]
243 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub show_caption_above_media: Option<bool>,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
250 #[serde(skip_serializing_if = "Option::is_none")]
252 pub input_message_content: Option<InputMessageContent>,
253}
254
255#[derive(Debug, Clone, Serialize, Deserialize)]
257pub struct InlineQueryResultGif {
258 pub id: String,
260 pub gif_url: String,
262 pub thumbnail_url: String,
264 #[serde(skip_serializing_if = "Option::is_none")]
266 pub gif_width: Option<u32>,
267 #[serde(skip_serializing_if = "Option::is_none")]
269 pub gif_height: Option<u32>,
270 #[serde(skip_serializing_if = "Option::is_none")]
272 pub gif_duration: Option<u32>,
273 #[serde(skip_serializing_if = "Option::is_none")]
275 pub thumbnail_mime_type: Option<String>,
276 #[serde(skip_serializing_if = "Option::is_none")]
278 pub title: Option<String>,
279 #[serde(skip_serializing_if = "Option::is_none")]
281 pub caption: Option<String>,
282 #[serde(skip_serializing_if = "Option::is_none")]
284 pub parse_mode: Option<crate::message::ParseMode>,
285 #[serde(skip_serializing_if = "Option::is_none")]
287 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
288 #[serde(skip_serializing_if = "Option::is_none")]
290 pub show_caption_above_media: Option<bool>,
291 #[serde(skip_serializing_if = "Option::is_none")]
293 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
294 #[serde(skip_serializing_if = "Option::is_none")]
296 pub input_message_content: Option<InputMessageContent>,
297}
298
299#[derive(Debug, Clone, Serialize, Deserialize)]
301pub struct InlineQueryResultMpeg4Gif {
302 pub id: String,
304 pub mpeg4_url: String,
306 pub thumbnail_url: String,
308 #[serde(skip_serializing_if = "Option::is_none")]
310 pub mpeg4_width: Option<u32>,
311 #[serde(skip_serializing_if = "Option::is_none")]
313 pub mpeg4_height: Option<u32>,
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub mpeg4_duration: Option<u32>,
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub thumbnail_mime_type: Option<String>,
320 #[serde(skip_serializing_if = "Option::is_none")]
322 pub title: Option<String>,
323 #[serde(skip_serializing_if = "Option::is_none")]
325 pub caption: Option<String>,
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub parse_mode: Option<crate::message::ParseMode>,
329 #[serde(skip_serializing_if = "Option::is_none")]
331 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
332 #[serde(skip_serializing_if = "Option::is_none")]
334 pub show_caption_above_media: Option<bool>,
335 #[serde(skip_serializing_if = "Option::is_none")]
337 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
338 #[serde(skip_serializing_if = "Option::is_none")]
340 pub input_message_content: Option<InputMessageContent>,
341}
342
343#[derive(Debug, Clone, Serialize, Deserialize)]
345pub struct InlineQueryResultVideo {
346 pub id: String,
348 pub video_url: String,
350 pub mime_type: String,
352 pub thumbnail_url: String,
354 pub title: String,
356 #[serde(skip_serializing_if = "Option::is_none")]
358 pub caption: Option<String>,
359 #[serde(skip_serializing_if = "Option::is_none")]
361 pub parse_mode: Option<crate::message::ParseMode>,
362 #[serde(skip_serializing_if = "Option::is_none")]
364 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub show_caption_above_media: Option<bool>,
368 #[serde(skip_serializing_if = "Option::is_none")]
370 pub video_width: Option<u32>,
371 #[serde(skip_serializing_if = "Option::is_none")]
373 pub video_height: Option<u32>,
374 #[serde(skip_serializing_if = "Option::is_none")]
376 pub video_duration: Option<u32>,
377 #[serde(skip_serializing_if = "Option::is_none")]
379 pub description: Option<String>,
380 #[serde(skip_serializing_if = "Option::is_none")]
382 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
383 #[serde(skip_serializing_if = "Option::is_none")]
385 pub input_message_content: Option<InputMessageContent>,
386}
387
388#[derive(Debug, Clone, Serialize, Deserialize)]
390pub struct InlineQueryResultAudio {
391 pub id: String,
393 pub audio_url: String,
395 pub title: String,
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub caption: Option<String>,
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub parse_mode: Option<crate::message::ParseMode>,
403 #[serde(skip_serializing_if = "Option::is_none")]
405 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
406 #[serde(skip_serializing_if = "Option::is_none")]
408 pub performer: Option<String>,
409 #[serde(skip_serializing_if = "Option::is_none")]
411 pub audio_duration: Option<u32>,
412 #[serde(skip_serializing_if = "Option::is_none")]
414 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
415 #[serde(skip_serializing_if = "Option::is_none")]
417 pub input_message_content: Option<InputMessageContent>,
418}
419
420#[derive(Debug, Clone, Serialize, Deserialize)]
422pub struct InlineQueryResultVoice {
423 pub id: String,
425 pub voice_url: String,
427 pub title: String,
429 #[serde(skip_serializing_if = "Option::is_none")]
431 pub caption: Option<String>,
432 #[serde(skip_serializing_if = "Option::is_none")]
434 pub parse_mode: Option<crate::message::ParseMode>,
435 #[serde(skip_serializing_if = "Option::is_none")]
437 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
438 #[serde(skip_serializing_if = "Option::is_none")]
440 pub voice_duration: Option<u32>,
441 #[serde(skip_serializing_if = "Option::is_none")]
443 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
444 #[serde(skip_serializing_if = "Option::is_none")]
446 pub input_message_content: Option<InputMessageContent>,
447}
448
449#[derive(Debug, Clone, Serialize, Deserialize)]
451pub struct InlineQueryResultDocument {
452 pub id: String,
454 pub title: String,
456 #[serde(skip_serializing_if = "Option::is_none")]
458 pub caption: Option<String>,
459 #[serde(skip_serializing_if = "Option::is_none")]
461 pub parse_mode: Option<crate::message::ParseMode>,
462 #[serde(skip_serializing_if = "Option::is_none")]
464 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
465 pub document_url: String,
467 pub mime_type: String,
469 #[serde(skip_serializing_if = "Option::is_none")]
471 pub description: Option<String>,
472 #[serde(skip_serializing_if = "Option::is_none")]
474 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
475 #[serde(skip_serializing_if = "Option::is_none")]
477 pub input_message_content: Option<InputMessageContent>,
478 #[serde(skip_serializing_if = "Option::is_none")]
480 pub thumbnail_url: Option<String>,
481 #[serde(skip_serializing_if = "Option::is_none")]
483 pub thumbnail_width: Option<u32>,
484 #[serde(skip_serializing_if = "Option::is_none")]
486 pub thumbnail_height: Option<u32>,
487}
488
489#[derive(Debug, Clone, Serialize, Deserialize)]
491pub struct InlineQueryResultLocation {
492 pub id: String,
494 pub latitude: f64,
496 pub longitude: f64,
498 pub title: String,
500 #[serde(skip_serializing_if = "Option::is_none")]
502 pub horizontal_accuracy: Option<f64>,
503 #[serde(skip_serializing_if = "Option::is_none")]
505 pub live_period: Option<u32>,
506 #[serde(skip_serializing_if = "Option::is_none")]
508 pub heading: Option<u16>,
509 #[serde(skip_serializing_if = "Option::is_none")]
511 pub proximity_alert_radius: Option<u32>,
512 #[serde(skip_serializing_if = "Option::is_none")]
514 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
515 #[serde(skip_serializing_if = "Option::is_none")]
517 pub input_message_content: Option<InputMessageContent>,
518 #[serde(skip_serializing_if = "Option::is_none")]
520 pub thumbnail_url: Option<String>,
521 #[serde(skip_serializing_if = "Option::is_none")]
523 pub thumbnail_width: Option<u32>,
524 #[serde(skip_serializing_if = "Option::is_none")]
526 pub thumbnail_height: Option<u32>,
527}
528
529#[derive(Debug, Clone, Serialize, Deserialize)]
531pub struct InlineQueryResultVenue {
532 pub id: String,
534 pub latitude: f64,
536 pub longitude: f64,
538 pub title: String,
540 pub address: String,
542 #[serde(skip_serializing_if = "Option::is_none")]
544 pub foursquare_id: Option<String>,
545 #[serde(skip_serializing_if = "Option::is_none")]
547 pub foursquare_type: Option<String>,
548 #[serde(skip_serializing_if = "Option::is_none")]
550 pub google_place_id: Option<String>,
551 #[serde(skip_serializing_if = "Option::is_none")]
553 pub google_place_type: Option<String>,
554 #[serde(skip_serializing_if = "Option::is_none")]
556 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
557 #[serde(skip_serializing_if = "Option::is_none")]
559 pub input_message_content: Option<InputMessageContent>,
560 #[serde(skip_serializing_if = "Option::is_none")]
562 pub thumbnail_url: Option<String>,
563 #[serde(skip_serializing_if = "Option::is_none")]
565 pub thumbnail_width: Option<u32>,
566 #[serde(skip_serializing_if = "Option::is_none")]
568 pub thumbnail_height: Option<u32>,
569}
570
571#[derive(Debug, Clone, Serialize, Deserialize)]
573pub struct InlineQueryResultContact {
574 pub id: String,
576 pub phone_number: String,
578 pub first_name: String,
580 #[serde(skip_serializing_if = "Option::is_none")]
582 pub last_name: Option<String>,
583 #[serde(skip_serializing_if = "Option::is_none")]
585 pub vcard: Option<String>,
586 #[serde(skip_serializing_if = "Option::is_none")]
588 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
589 #[serde(skip_serializing_if = "Option::is_none")]
591 pub input_message_content: Option<InputMessageContent>,
592 #[serde(skip_serializing_if = "Option::is_none")]
594 pub thumbnail_url: Option<String>,
595 #[serde(skip_serializing_if = "Option::is_none")]
597 pub thumbnail_width: Option<u32>,
598 #[serde(skip_serializing_if = "Option::is_none")]
600 pub thumbnail_height: Option<u32>,
601}
602
603#[derive(Debug, Clone, Serialize, Deserialize)]
605pub struct InlineQueryResultGame {
606 pub id: String,
608 pub game_short_name: String,
610 #[serde(skip_serializing_if = "Option::is_none")]
612 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
613}
614
615#[derive(Debug, Clone, Serialize, Deserialize)]
619pub struct InlineQueryResultCachedPhoto {
620 pub id: String,
622 pub photo_file_id: String,
624 #[serde(skip_serializing_if = "Option::is_none")]
626 pub title: Option<String>,
627 #[serde(skip_serializing_if = "Option::is_none")]
629 pub description: Option<String>,
630 #[serde(skip_serializing_if = "Option::is_none")]
632 pub caption: Option<String>,
633 #[serde(skip_serializing_if = "Option::is_none")]
635 pub parse_mode: Option<crate::message::ParseMode>,
636 #[serde(skip_serializing_if = "Option::is_none")]
638 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
639 #[serde(skip_serializing_if = "Option::is_none")]
641 pub show_caption_above_media: Option<bool>,
642 #[serde(skip_serializing_if = "Option::is_none")]
644 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
645 #[serde(skip_serializing_if = "Option::is_none")]
647 pub input_message_content: Option<InputMessageContent>,
648}
649
650#[derive(Debug, Clone, Serialize, Deserialize)]
652pub struct InlineQueryResultCachedGif {
653 pub id: String,
655 pub gif_file_id: String,
657 #[serde(skip_serializing_if = "Option::is_none")]
659 pub title: Option<String>,
660 #[serde(skip_serializing_if = "Option::is_none")]
662 pub caption: Option<String>,
663 #[serde(skip_serializing_if = "Option::is_none")]
665 pub parse_mode: Option<crate::message::ParseMode>,
666 #[serde(skip_serializing_if = "Option::is_none")]
668 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
669 #[serde(skip_serializing_if = "Option::is_none")]
671 pub show_caption_above_media: Option<bool>,
672 #[serde(skip_serializing_if = "Option::is_none")]
674 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
675 #[serde(skip_serializing_if = "Option::is_none")]
677 pub input_message_content: Option<InputMessageContent>,
678}
679
680#[derive(Debug, Clone, Serialize, Deserialize)]
682pub struct InlineQueryResultCachedMpeg4Gif {
683 pub id: String,
685 pub mpeg4_file_id: String,
687 #[serde(skip_serializing_if = "Option::is_none")]
689 pub title: Option<String>,
690 #[serde(skip_serializing_if = "Option::is_none")]
692 pub caption: Option<String>,
693 #[serde(skip_serializing_if = "Option::is_none")]
695 pub parse_mode: Option<crate::message::ParseMode>,
696 #[serde(skip_serializing_if = "Option::is_none")]
698 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
699 #[serde(skip_serializing_if = "Option::is_none")]
701 pub show_caption_above_media: Option<bool>,
702 #[serde(skip_serializing_if = "Option::is_none")]
704 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
705 #[serde(skip_serializing_if = "Option::is_none")]
707 pub input_message_content: Option<InputMessageContent>,
708}
709
710#[derive(Debug, Clone, Serialize, Deserialize)]
712pub struct InlineQueryResultCachedSticker {
713 pub id: String,
715 pub sticker_file_id: String,
717 #[serde(skip_serializing_if = "Option::is_none")]
719 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
720 #[serde(skip_serializing_if = "Option::is_none")]
722 pub input_message_content: Option<InputMessageContent>,
723}
724
725#[derive(Debug, Clone, Serialize, Deserialize)]
727pub struct InlineQueryResultCachedDocument {
728 pub id: String,
730 pub title: String,
732 pub document_file_id: String,
734 #[serde(skip_serializing_if = "Option::is_none")]
736 pub description: Option<String>,
737 #[serde(skip_serializing_if = "Option::is_none")]
739 pub caption: Option<String>,
740 #[serde(skip_serializing_if = "Option::is_none")]
742 pub parse_mode: Option<crate::message::ParseMode>,
743 #[serde(skip_serializing_if = "Option::is_none")]
745 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
746 #[serde(skip_serializing_if = "Option::is_none")]
748 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
749 #[serde(skip_serializing_if = "Option::is_none")]
751 pub input_message_content: Option<InputMessageContent>,
752}
753
754#[derive(Debug, Clone, Serialize, Deserialize)]
756pub struct InlineQueryResultCachedVideo {
757 pub id: String,
759 pub video_file_id: String,
761 pub title: String,
763 #[serde(skip_serializing_if = "Option::is_none")]
765 pub description: Option<String>,
766 #[serde(skip_serializing_if = "Option::is_none")]
768 pub caption: Option<String>,
769 #[serde(skip_serializing_if = "Option::is_none")]
771 pub parse_mode: Option<crate::message::ParseMode>,
772 #[serde(skip_serializing_if = "Option::is_none")]
774 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
775 #[serde(skip_serializing_if = "Option::is_none")]
777 pub show_caption_above_media: Option<bool>,
778 #[serde(skip_serializing_if = "Option::is_none")]
780 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
781 #[serde(skip_serializing_if = "Option::is_none")]
783 pub input_message_content: Option<InputMessageContent>,
784}
785
786#[derive(Debug, Clone, Serialize, Deserialize)]
788pub struct InlineQueryResultCachedVoice {
789 pub id: String,
791 pub voice_file_id: String,
793 pub title: String,
795 #[serde(skip_serializing_if = "Option::is_none")]
797 pub caption: Option<String>,
798 #[serde(skip_serializing_if = "Option::is_none")]
800 pub parse_mode: Option<crate::message::ParseMode>,
801 #[serde(skip_serializing_if = "Option::is_none")]
803 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
804 #[serde(skip_serializing_if = "Option::is_none")]
806 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
807 #[serde(skip_serializing_if = "Option::is_none")]
809 pub input_message_content: Option<InputMessageContent>,
810}
811
812#[derive(Debug, Clone, Serialize, Deserialize)]
814pub struct InlineQueryResultCachedAudio {
815 pub id: String,
817 pub audio_file_id: String,
819 #[serde(skip_serializing_if = "Option::is_none")]
821 pub caption: Option<String>,
822 #[serde(skip_serializing_if = "Option::is_none")]
824 pub parse_mode: Option<crate::message::ParseMode>,
825 #[serde(skip_serializing_if = "Option::is_none")]
827 pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
828 #[serde(skip_serializing_if = "Option::is_none")]
830 pub reply_markup: Option<crate::keyboard::InlineKeyboardMarkup>,
831 #[serde(skip_serializing_if = "Option::is_none")]
833 pub input_message_content: Option<InputMessageContent>,
834}
835
836#[derive(Debug, Clone, Serialize, Deserialize)]
853#[serde(untagged)]
854pub enum InputMessageContent {
855 Text(InputTextMessageContent),
857 Rich(crate::rich_message::InputRichMessageContent),
859 Venue(InputVenueMessageContent),
861 Location(InputLocationMessageContent),
863 Contact(InputContactMessageContent),
865 Invoice(InputInvoiceMessageContent),
867}
868
869#[derive(Debug, Clone, Serialize, Deserialize)]
871pub struct InputTextMessageContent {
872 pub message_text: String,
874 #[serde(skip_serializing_if = "Option::is_none")]
876 pub parse_mode: Option<crate::message::ParseMode>,
877 #[serde(skip_serializing_if = "Option::is_none")]
879 pub entities: Option<Vec<crate::message::MessageEntity>>,
880 #[serde(skip_serializing_if = "Option::is_none")]
882 pub link_preview_options: Option<crate::message::LinkPreviewOptions>,
883}
884
885#[derive(Debug, Clone, Serialize, Deserialize)]
887pub struct InputLocationMessageContent {
888 pub latitude: f64,
890 pub longitude: f64,
892 #[serde(skip_serializing_if = "Option::is_none")]
894 pub horizontal_accuracy: Option<f64>,
895 #[serde(skip_serializing_if = "Option::is_none")]
897 pub live_period: Option<u32>,
898 #[serde(skip_serializing_if = "Option::is_none")]
900 pub heading: Option<u16>,
901 #[serde(skip_serializing_if = "Option::is_none")]
903 pub proximity_alert_radius: Option<u32>,
904}
905
906#[derive(Debug, Clone, Serialize, Deserialize)]
908pub struct InputVenueMessageContent {
909 pub latitude: f64,
911 pub longitude: f64,
913 pub title: String,
915 pub address: String,
917 #[serde(skip_serializing_if = "Option::is_none")]
919 pub foursquare_id: Option<String>,
920 #[serde(skip_serializing_if = "Option::is_none")]
922 pub foursquare_type: Option<String>,
923 #[serde(skip_serializing_if = "Option::is_none")]
925 pub google_place_id: Option<String>,
926 #[serde(skip_serializing_if = "Option::is_none")]
928 pub google_place_type: Option<String>,
929}
930
931#[derive(Debug, Clone, Serialize, Deserialize)]
933pub struct InputContactMessageContent {
934 pub phone_number: String,
936 pub first_name: String,
938 #[serde(skip_serializing_if = "Option::is_none")]
940 pub last_name: Option<String>,
941 #[serde(skip_serializing_if = "Option::is_none")]
943 pub vcard: Option<String>,
944}
945
946#[derive(Debug, Clone, Serialize, Deserialize)]
948pub struct InputInvoiceMessageContent {
949 pub title: String,
951 pub description: String,
953 pub payload: String,
955 #[serde(skip_serializing_if = "Option::is_none")]
957 pub provider_token: Option<String>,
958 pub currency: String,
960 pub prices: Vec<crate::payments::LabeledPrice>,
962 #[serde(skip_serializing_if = "Option::is_none")]
964 pub max_tip_amount: Option<u64>,
965 #[serde(skip_serializing_if = "Option::is_none")]
967 pub suggested_tip_amounts: Option<Vec<u64>>,
968 #[serde(skip_serializing_if = "Option::is_none")]
970 pub provider_data: Option<String>,
971 #[serde(skip_serializing_if = "Option::is_none")]
973 pub photo_url: Option<String>,
974 #[serde(skip_serializing_if = "Option::is_none")]
976 pub photo_size: Option<u64>,
977 #[serde(skip_serializing_if = "Option::is_none")]
979 pub photo_width: Option<u32>,
980 #[serde(skip_serializing_if = "Option::is_none")]
982 pub photo_height: Option<u32>,
983 #[serde(skip_serializing_if = "Option::is_none")]
985 pub need_name: Option<bool>,
986 #[serde(skip_serializing_if = "Option::is_none")]
988 pub need_phone_number: Option<bool>,
989 #[serde(skip_serializing_if = "Option::is_none")]
991 pub need_email: Option<bool>,
992 #[serde(skip_serializing_if = "Option::is_none")]
994 pub need_shipping_address: Option<bool>,
995 #[serde(skip_serializing_if = "Option::is_none")]
997 pub send_phone_number_to_provider: Option<bool>,
998 #[serde(skip_serializing_if = "Option::is_none")]
1000 pub send_email_to_provider: Option<bool>,
1001 #[serde(skip_serializing_if = "Option::is_none")]
1003 pub is_flexible: Option<bool>,
1004}
1005
1006#[derive(Debug, Clone, Serialize, Deserialize)]
1010pub struct SentWebAppMessage {
1011 #[serde(skip_serializing_if = "Option::is_none")]
1013 pub inline_message_id: Option<String>,
1014}
1015
1016#[derive(Debug, Clone, Serialize, Deserialize)]
1020pub struct SentGuestMessage {
1021 pub inline_message_id: String,
1023}
1024
1025#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1029#[non_exhaustive]
1030pub struct InlineQueryResultsButton {
1031 pub text: String,
1033 #[serde(skip_serializing_if = "Option::is_none")]
1035 pub web_app: Option<crate::message::WebAppInfo>,
1036 #[serde(skip_serializing_if = "Option::is_none")]
1038 pub start_parameter: Option<String>,
1039}
1040
1041#[derive(Debug, Clone, Default, Serialize, Deserialize)]
1043#[non_exhaustive]
1044pub struct PreparedInlineMessage {
1045 pub id: String,
1047 pub expiration_date: i64,
1049}