use serde::{ser::SerializeMap, Serialize};
pub type Markup<'a> = &'a [&'a [Button<'a>]];
const REGULAR: &str = "regular";
const QUIZ: &str = "quiz";
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
#[must_use]
pub enum RequestPollKind {
Any,
Regular,
Quiz,
}
impl<'a> serde::Serialize for RequestPollKind {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
let mut map =
s.serialize_map(Some(if *self == Self::Any { 0 } else { 1 }))?;
match self {
Self::Any => Ok(()),
Self::Regular => map.serialize_entry("type", REGULAR),
Self::Quiz => map.serialize_entry("type", QUIZ),
}?;
map.end()
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
#[must_use]
pub enum RequestKind {
Location,
Contact,
Poll(RequestPollKind),
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
#[must_use]
pub struct Button<'a> {
text: &'a str,
request: Option<RequestKind>,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Serialize)]
#[must_use]
pub struct Keyboard<'a> {
keyboard: Markup<'a>,
#[serde(skip_serializing_if = "Option::is_none")]
resize_keyboard: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
one_time_keyboard: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
selective: Option<bool>,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Default)]
#[must_use]
pub struct Remove {
selective: Option<bool>,
}
impl<'a> Button<'a> {
pub const fn new(text: &'a str) -> Self {
Self {
text,
request: None,
}
}
pub const fn request(mut self, request: RequestKind) -> Self {
self.request = Some(request);
self
}
}
impl<'a> serde::Serialize for Button<'a> {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
let len = if self.request.is_some() { 2 } else { 1 };
let mut map = s.serialize_map(Some(len))?;
map.serialize_entry("text", self.text)?;
match self.request {
Some(RequestKind::Location) => {
map.serialize_entry("request_location", &true)
}
Some(RequestKind::Contact) => {
map.serialize_entry("request_contact", &true)
}
Some(RequestKind::Poll(poll_kind)) => {
map.serialize_entry("request_poll", &poll_kind)
}
None => Ok(()),
}?;
map.end()
}
}
impl<'a> Keyboard<'a> {
pub const fn new(keyboard: Markup<'a>) -> Self {
Self {
keyboard,
resize_keyboard: None,
one_time_keyboard: None,
selective: None,
}
}
pub fn resize_keyboard(mut self, is_resized: bool) -> Self {
self.resize_keyboard = Some(is_resized);
self
}
pub fn one_time_keyboard(mut self, is_one_time: bool) -> Self {
self.one_time_keyboard = Some(is_one_time);
self
}
pub fn selective(mut self, is_selective: bool) -> Self {
self.selective = Some(is_selective);
self
}
}
impl<'a> From<Markup<'a>> for Keyboard<'a> {
fn from(markup: Markup<'a>) -> Self {
Self::new(markup)
}
}
impl Remove {
pub const fn new() -> Self {
Self { selective: None }
}
pub fn selective(mut self, is_selective: bool) -> Self {
self.selective = Some(is_selective);
self
}
}
impl serde::Serialize for Remove {
fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
let len = if self.selective.is_some() { 2 } else { 1 };
let mut map = s.serialize_map(Some(len))?;
map.serialize_entry("remove_keyboard", &true)?;
if let Some(selective) = self.selective {
map.serialize_entry("selective", &selective)?;
}
map.end()
}
}