use crate::models::{CallbackGame, Message, User, WebAppInfo};
use crate::Builder;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(untagged)]
pub enum ReplyMarkup {
InlineKeyboard(InlineKeyboardMarkup),
ReplyKeyboard(ReplyKeyboardMarkup),
ReplyKeyboardRemove(ReplyKeyboardRemove),
ForceReply(ForceReply),
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct InlineKeyboardMarkup {
pub inline_keyboard: Vec<Vec<InlineKeyboardButton>>,
}
impl InlineKeyboardMarkup {
pub fn new(buttons: Vec<Vec<InlineKeyboardButton>>) -> InlineKeyboardMarkup {
InlineKeyboardMarkup { inline_keyboard: buttons }
}
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct InlineKeyboardButton {
pub text: String,
#[serde(flatten)]
pub _type: InlineKeyboardButtonType,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
#[serde(untagged)]
pub enum InlineKeyboardButtonType {
Url(String),
CallbackData(String),
WebApp(WebAppInfo),
LoginUrl(LoginUrl),
SwitchInlineQuery(String),
SwitchInlineQueryCurrentChat(String),
CallbackGame(CallbackGame),
Pay(bool),
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct ReplyKeyboardMarkup {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub keyboard: Vec<Vec<KeyboardButton>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_persistent: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resize_keyboard: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub one_time_keyboard: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub input_field_placeholder: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct KeyboardButton {
pub text: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_contact: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_location: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_poll: Option<KeyboardButtonPollType>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub web_app: Option<WebAppInfo>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct KeyboardButtonPollType {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub _type: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct ReplyKeyboardRemove {
pub remove_keyboard: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct LoginUrl {
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub forward_text: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub bot_username: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub request_write_access: Option<bool>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct CallbackQuery {
pub id: String,
pub from: User,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<Message>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub inline_message_id: Option<String>,
pub chat_instance: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub game_short_name: Option<String>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Builder)]
pub struct ForceReply {
pub force_reply: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub input_field_placeholder: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}