use super::{CallbackGame, ChatAdministratorRights, LoginUrl};
use serde::{Deserialize, Serialize};
use telexide_proc_macros::build_struct;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct InlineKeyboardMarkup {
pub inline_keyboard: Vec<Vec<InlineKeyboardButton>>,
}
impl InlineKeyboardMarkup {
pub fn new() -> Self {
Self {
inline_keyboard: vec![Vec::new()],
}
}
pub fn add_button(&mut self, button: InlineKeyboardButton) -> &mut Self {
if let Some(row) = self.inline_keyboard.last_mut() {
row.push(button);
}
self
}
pub fn add_new_row(&mut self) -> &mut Self {
self.inline_keyboard.push(Vec::new());
self
}
pub fn add_row(&mut self, buttons: Vec<InlineKeyboardButton>) -> &mut Self {
self.inline_keyboard.push(buttons);
self
}
}
impl Default for InlineKeyboardMarkup {
fn default() -> Self {
Self::new()
}
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct InlineKeyboardButton {
pub text: String,
pub url: Option<String>,
pub login_url: Option<LoginUrl>,
pub callback_data: Option<String>,
pub web_app: Option<WebAppInfo>,
pub switch_inline_query: Option<String>,
pub switch_inline_query_current_chat: Option<String>,
pub switch_inline_query_chosen_chat: Option<SwitchInlineQueryChosenChat>,
pub callback_game: Option<CallbackGame>,
#[serde(default)]
pub pay: bool,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SwitchInlineQueryChosenChat {
#[serde(skip_serializing_if = "Option::is_none")]
pub query: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_user_chats: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_bot_chats: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_group_chats: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub allow_channel_shats: Option<bool>,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ReplyKeyboardMarkup {
pub keyboard: Vec<Vec<KeyboardButton>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub is_persistent: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resize_keyboard: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub one_time_keyboard: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_field_placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ReplyKeyboardRemove {
pub remove_keyboard: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ForceReply {
pub force_reply: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_field_placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub selective: Option<bool>,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct KeyboardButton {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_user: Option<KeyboardButtonRequestUser>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_chat: Option<KeyboardButtonRequestChat>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_contact: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_location: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_poll: Option<KeyboardButtonPollType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub web_app: Option<WebAppInfo>,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct KeyboardButtonPollType {
#[serde(rename = "type")]
pub poll_type: super::PollType,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct WebAppInfo {
pub url: String,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct KeyboardButtonRequestUser {
pub request_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_is_bot: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_is_premium: Option<bool>,
}
#[build_struct]
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct KeyboardButtonRequestChat {
pub request_id: i32,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_is_channel: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_is_forum: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_has_username: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub chat_is_created: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_administrator_rights: Option<ChatAdministratorRights>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bot_administrator_rights: Option<ChatAdministratorRights>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bot_is_member: Option<bool>,
}