use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PhotoSize {
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct File {
pub file_id: String,
pub file_unique_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_path: Option<String>,
}
impl File {
#[must_use]
pub fn url(&self, token: &str) -> Option<String> {
self.file_path
.as_ref()
.map(|path| format!("https://api.telegram.org/file/bot{token}/{path}"))
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Audio {
pub file_id: String,
pub file_unique_id: String,
pub duration: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub performer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<PhotoSize>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Document {
pub file_id: String,
pub file_unique_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<PhotoSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoQuality {
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
pub codec: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Video {
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
pub duration: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<PhotoSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover: Option<Vec<PhotoSize>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_timestamp: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub qualities: Option<Vec<VideoQuality>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Animation {
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
pub duration: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<PhotoSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Voice {
pub file_id: String,
pub file_unique_id: String,
pub duration: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VideoNote {
pub file_id: String,
pub file_unique_id: String,
pub length: u32,
pub duration: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<PhotoSize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LivePhoto {
#[serde(skip_serializing_if = "Option::is_none")]
pub photo: Option<Vec<PhotoSize>>,
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
pub duration: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<u64>,
}
#[derive(Debug, Clone)]
pub enum InputFile {
FileId(String),
Url(String),
Bytes {
filename: String,
data: Vec<u8>,
mime_type: String,
},
Attach(String),
}
impl InputFile {
#[must_use]
pub fn as_str(&self) -> &str {
match self {
Self::FileId(id) => id,
Self::Url(url) => url,
Self::Attach(name) => name,
Self::Bytes { filename, .. } => filename,
}
}
#[must_use]
pub fn requires_multipart(&self) -> bool {
matches!(self, Self::Bytes { .. })
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PassportFile {
pub file_id: String,
pub file_unique_id: String,
pub file_size: u64,
pub file_date: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaPhoto {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_caption_above_media: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaVideo {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_timestamp: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_caption_above_media: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_streaming: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaAnimation {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_caption_above_media: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaAudio {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub performer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaVoiceNote {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaDocument {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disable_content_type_detection: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaLivePhoto {
pub media: String,
pub photo: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_mode: Option<crate::message::ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
pub caption_entities: Option<Vec<crate::message::MessageEntity>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub show_caption_above_media: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaLocation {
pub latitude: f64,
pub longitude: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub horizontal_accuracy: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaVenue {
pub latitude: f64,
pub longitude: f64,
pub title: String,
pub address: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub foursquare_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub foursquare_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_place_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub google_place_type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputMediaSticker {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub emoji: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum InputMedia {
Photo(InputMediaPhoto),
Video(InputMediaVideo),
Animation(InputMediaAnimation),
Audio(InputMediaAudio),
Document(InputMediaDocument),
LivePhoto(InputMediaLivePhoto),
VoiceNote(InputMediaVoiceNote),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputPaidMediaPhoto {
pub media: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputPaidMediaVideo {
pub media: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub thumbnail: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cover: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_timestamp: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub supports_streaming: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputPaidMediaLivePhoto {
pub media: String,
pub photo: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum InputPaidMedia {
Photo(InputPaidMediaPhoto),
Video(InputPaidMediaVideo),
LivePhoto(InputPaidMediaLivePhoto),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputProfilePhotoStatic {
pub photo: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InputProfilePhotoAnimated {
pub animation: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub main_frame_timestamp: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum InputProfilePhoto {
Static(InputProfilePhotoStatic),
Animated(InputProfilePhotoAnimated),
}