use serde::{Deserialize, Serialize};
use crate::markup::{MessageEntity, ParseMode};
use crate::{JsonMethod, TelegramMethod};
#[derive(Debug, Deserialize)]
pub struct Animation {
pub file_id: String,
pub file_unique_id: String,
pub width: usize,
pub height: usize,
pub duration: u32,
pub thumb: Option<PhotoSize>,
pub file_name: Option<String>,
pub mime_type: Option<String>,
pub file_size: Option<usize>,
}
#[derive(Debug, Deserialize)]
pub struct Audio {
pub file_id: String,
pub file_unique_id: String,
pub duration: u32,
pub performer: Option<String>,
pub title: Option<String>,
pub file_name: Option<String>,
pub mime_type: Option<String>,
pub file_size: Option<usize>,
pub thumb: Option<PhotoSize>,
}
#[derive(Debug, Deserialize)]
pub struct Document {
pub file_id: String,
pub file_unique_id: String,
pub thumb: Option<PhotoSize>,
pub file_name: Option<String>,
pub mime_type: Option<String>,
pub file_size: Option<usize>,
}
#[derive(Debug, Deserialize)]
pub struct PhotoSize {
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
pub file_size: u32,
}
#[derive(Debug, Deserialize)]
pub struct Video {
pub file_id: String,
pub file_unique_id: String,
pub width: u32,
pub height: u32,
pub duration: u32,
pub thumb: Option<PhotoSize>,
pub file_name: Option<String>,
pub mime_type: Option<String>,
pub file_size: Option<u32>,
}
#[derive(Debug, Deserialize)]
pub struct VideoNote {
pub file_id: String,
pub file_unique_id: String,
pub length: u32,
pub duration: u32,
pub thumb: Option<PhotoSize>,
pub file_size: Option<u32>,
}
#[derive(Debug, Deserialize)]
pub struct Voice {
pub file_id: String,
pub file_unique_id: String,
pub duration: u32,
pub mime_type: Option<String>,
pub file_size: Option<u32>,
}
#[derive(Debug, Deserialize)]
pub struct File {
pub file_id: String,
pub file_unique_id: String,
pub file_size: Option<u32>,
pub file_path: Option<String>,
}
#[derive(Clone, Serialize)]
#[serde(rename_all = "snake_case", tag = "type")]
pub enum InputMedia {
Photo {
media: String,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
caption_entities: Option<Vec<MessageEntity>>,
},
Video {
media: String,
#[serde(skip_serializing_if = "Option::is_none")]
thumb: Option<InputFileVariant>,
#[serde(skip_serializing_if = "Option::is_none")]
width: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
height: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
duration: Option<u32>,
supports_streaming: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
caption_entities: Option<Vec<MessageEntity>>,
},
Animation {
media: String,
#[serde(skip_serializing_if = "Option::is_none")]
thumb: Option<InputFileVariant>,
#[serde(skip_serializing_if = "Option::is_none")]
width: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
height: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
duration: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
caption_entities: Option<Vec<MessageEntity>>,
},
Audio {
media: String,
#[serde(skip_serializing_if = "Option::is_none")]
thumb: Option<InputFileVariant>,
#[serde(skip_serializing_if = "Option::is_none")]
performer: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
duration: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
caption_entities: Option<Vec<MessageEntity>>,
},
Document {
media: String,
#[serde(skip_serializing_if = "Option::is_none")]
thumb: Option<InputFileVariant>,
#[serde(skip_serializing_if = "Option::is_none")]
caption: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
parse_mode: Option<ParseMode>,
#[serde(skip_serializing_if = "Option::is_none")]
caption_entities: Option<Vec<MessageEntity>>,
},
}
#[derive(Clone, Serialize)]
#[serde(untagged)]
pub enum InputFileVariant {
File(InputFile),
Id(String),
}
impl From<InputFile> for InputFileVariant {
fn from(file: InputFile) -> Self {
Self::File(file)
}
}
impl From<String> for InputFileVariant {
fn from(id: String) -> Self {
Self::Id(id)
}
}
impl From<&str> for InputFileVariant {
fn from(id: &str) -> Self {
Self::Id(id.to_string())
}
}
#[derive(Clone)]
pub struct InputFile {
pub name: String,
pub data: Vec<u8>,
pub mime: String,
}
impl Serialize for InputFile {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
"".serialize(serializer)
}
}
#[derive(Clone, Serialize)]
pub struct GetFile {
pub file_id: String,
}
impl GetFile {
pub fn new(file_id: impl Into<String>) -> Self {
Self {
file_id: file_id.into(),
}
}
}
impl TelegramMethod for GetFile {
type Response = File;
fn name() -> &'static str {
"getFile"
}
}
impl JsonMethod for GetFile {}