use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize)]
pub struct Update {
pub update_id: i64,
#[serde(flatten)]
pub kind: UpdateKind,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "snake_case")]
#[allow(clippy::large_enum_variant)]
pub enum UpdateKind {
Message(Message),
EditedMessage(Message),
CallbackQuery(CallbackQuery),
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Message {
pub message_id: i64,
pub from: Option<User>,
pub chat: Chat,
pub date: i64,
pub text: Option<String>,
pub entities: Option<Vec<MessageEntity>>,
pub reply_to_message: Option<Box<Message>>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct User {
pub id: i64,
pub is_bot: bool,
pub first_name: String,
pub last_name: Option<String>,
pub username: Option<String>,
pub language_code: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct Chat {
pub id: i64,
#[serde(rename = "type")]
pub chat_type: ChatType,
pub title: Option<String>,
pub username: Option<String>,
pub first_name: Option<String>,
pub last_name: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ChatType {
Private,
Group,
Supergroup,
Channel,
}
#[derive(Debug, Clone, Deserialize)]
pub struct MessageEntity {
#[serde(rename = "type")]
pub entity_type: EntityType,
pub offset: i64,
pub length: i64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum EntityType {
Mention,
Hashtag,
Cashtag,
BotCommand,
Url,
Email,
PhoneNumber,
Bold,
Italic,
Underline,
Strikethrough,
Spoiler,
Code,
Pre,
TextLink,
TextMention,
CustomEmoji,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Deserialize)]
pub struct CallbackQuery {
pub id: String,
pub from: User,
pub message: Option<Message>,
pub inline_message_id: Option<String>,
pub chat_instance: String,
pub data: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
pub struct InlineKeyboardMarkup {
pub inline_keyboard: Vec<Vec<InlineKeyboardButton>>,
}
#[derive(Debug, Clone, Serialize)]
pub struct InlineKeyboardButton {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_data: Option<String>,
}
impl InlineKeyboardButton {
pub fn callback(text: impl Into<String>, data: impl Into<String>) -> Self {
Self {
text: text.into(),
url: None,
callback_data: Some(data.into()),
}
}
pub fn url(text: impl Into<String>, url: impl Into<String>) -> Self {
Self {
text: text.into(),
url: Some(url.into()),
callback_data: None,
}
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(untagged)]
pub enum ReplyMarkup {
InlineKeyboard(InlineKeyboardMarkup),
}
#[derive(Debug, Clone, Serialize)]
pub struct BotCommand {
pub command: String,
pub description: String,
}
impl BotCommand {
pub fn new(command: impl Into<String>, description: impl Into<String>) -> Self {
Self {
command: command.into(),
description: description.into(),
}
}
}