use grammers_tl_types as tl;
use super::{Button, Key};
const EMPTY_KEYBOARD_MARKUP: tl::types::ReplyKeyboardMarkup = tl::types::ReplyKeyboardMarkup {
resize: false,
single_use: false,
selective: false,
persistent: false,
rows: Vec::new(),
placeholder: None,
};
pub struct ReplyMarkup {
pub raw: tl::enums::ReplyMarkup,
}
impl ReplyMarkup {
pub fn from_buttons(buttons: &[Vec<Button>]) -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyInlineMarkup(tl::types::ReplyInlineMarkup {
rows: buttons
.into_iter()
.map(|row| {
tl::types::KeyboardButtonRow {
buttons: row.into_iter().map(|button| button.raw.clone()).collect(),
}
.into()
})
.collect(),
}),
}
}
pub fn from_buttons_row(buttons: &[Button]) -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyInlineMarkup(tl::types::ReplyInlineMarkup {
rows: vec![tl::enums::KeyboardButtonRow::Row(
tl::types::KeyboardButtonRow {
buttons: buttons
.into_iter()
.map(|button| button.raw.clone())
.collect(),
},
)],
}),
}
}
pub fn from_buttons_col(buttons: &[Button]) -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyInlineMarkup(tl::types::ReplyInlineMarkup {
rows: buttons
.into_iter()
.map(|button| {
tl::enums::KeyboardButtonRow::Row(tl::types::KeyboardButtonRow {
buttons: vec![button.raw.clone()],
})
})
.collect(),
}),
}
}
pub fn from_keys(keys: &[Vec<Key>]) -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyKeyboardMarkup(tl::types::ReplyKeyboardMarkup {
rows: keys
.into_iter()
.map(|row| {
tl::types::KeyboardButtonRow {
buttons: row.into_iter().map(|key| key.raw.clone()).collect(),
}
.into()
})
.collect(),
..EMPTY_KEYBOARD_MARKUP
}),
}
}
pub fn from_keys_row(keys: &[Key]) -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyKeyboardMarkup(tl::types::ReplyKeyboardMarkup {
rows: vec![tl::enums::KeyboardButtonRow::Row(
tl::types::KeyboardButtonRow {
buttons: keys.into_iter().map(|key| key.raw.clone()).collect(),
},
)],
..EMPTY_KEYBOARD_MARKUP
}),
}
}
pub fn from_keys_col(keys: &[Key]) -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyKeyboardMarkup(tl::types::ReplyKeyboardMarkup {
rows: keys
.into_iter()
.map(|key| {
tl::enums::KeyboardButtonRow::Row(tl::types::KeyboardButtonRow {
buttons: vec![key.raw.clone()],
})
})
.collect(),
..EMPTY_KEYBOARD_MARKUP
}),
}
}
pub fn hide() -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyKeyboardHide(tl::types::ReplyKeyboardHide {
selective: false,
}),
}
}
pub fn force_reply() -> Self {
Self {
raw: tl::enums::ReplyMarkup::ReplyKeyboardForceReply(
tl::types::ReplyKeyboardForceReply {
single_use: false,
selective: false,
placeholder: None,
},
),
}
}
pub fn fit_size(mut self) -> Self {
use grammers_tl_types::enums::ReplyMarkup as RM;
match &mut self.raw {
RM::ReplyKeyboardMarkup(keyboard) => keyboard.resize = true,
RM::ReplyKeyboardHide(_)
| RM::ReplyKeyboardForceReply(_)
| RM::ReplyInlineMarkup(_) => {}
}
self
}
pub fn single_use(mut self) -> Self {
use grammers_tl_types::enums::ReplyMarkup as RM;
match &mut self.raw {
RM::ReplyKeyboardForceReply(keyboard) => keyboard.single_use = true,
RM::ReplyKeyboardMarkup(keyboard) => keyboard.single_use = true,
RM::ReplyKeyboardHide(_) | RM::ReplyInlineMarkup(_) => {}
}
self
}
pub fn selective(mut self) -> Self {
use grammers_tl_types::enums::ReplyMarkup as RM;
match &mut self.raw {
RM::ReplyKeyboardHide(keyboard) => keyboard.selective = true,
RM::ReplyKeyboardForceReply(keyboard) => keyboard.selective = true,
RM::ReplyKeyboardMarkup(keyboard) => keyboard.selective = true,
RM::ReplyInlineMarkup(_) => {}
}
self
}
}