use serde::Serialize;
use serde_json::Error as JsonError;
use std::{error::Error as StdError, fmt};
mod force_reply;
mod inline_keyboard;
mod reply_keyboard;
pub use self::{force_reply::*, inline_keyboard::*, reply_keyboard::*};
#[derive(Clone, Debug, derive_more::From, Serialize)]
#[serde(untagged)]
pub enum ReplyMarkup {
ForceReply(ForceReply),
InlineKeyboardMarkup(InlineKeyboardMarkup),
ReplyKeyboardMarkup(ReplyKeyboardMarkup),
ReplyKeyboardRemove(ReplyKeyboardRemove),
}
impl ReplyMarkup {
pub(crate) fn serialize(&self) -> Result<String, ReplyMarkupError> {
serde_json::to_string(self).map_err(ReplyMarkupError::Serialize)
}
}
impl From<Vec<Vec<InlineKeyboardButton>>> for ReplyMarkup {
fn from(markup: Vec<Vec<InlineKeyboardButton>>) -> ReplyMarkup {
ReplyMarkup::InlineKeyboardMarkup(markup.into())
}
}
impl From<Vec<Vec<KeyboardButton>>> for ReplyMarkup {
fn from(markup: Vec<Vec<KeyboardButton>>) -> ReplyMarkup {
ReplyMarkup::ReplyKeyboardMarkup(markup.into())
}
}
#[derive(Debug)]
pub enum ReplyMarkupError {
Serialize(JsonError),
}
impl StdError for ReplyMarkupError {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
match self {
ReplyMarkupError::Serialize(err) => Some(err),
}
}
}
impl fmt::Display for ReplyMarkupError {
fn fmt(&self, out: &mut fmt::Formatter) -> fmt::Result {
match self {
ReplyMarkupError::Serialize(err) => write!(out, "can not serialize reply markup: {}", err),
}
}
}