Files
pawctioneer-bot/src/keyboard_utils.rs
Dylan Knutson d4ccbb884c Refactor keyboard utilities and improve user interface
- Extract keyboard utility functions to new keyboard_utils.rs module
- Update new listing command with improved keyboard handling
- Enhance message utilities with better user interaction
- Refactor user ID type handling
- Remove development database file
- Update main.rs with improved structure
2025-08-28 20:01:15 +00:00

84 lines
2.5 KiB
Rust

#[macro_export]
macro_rules! keyboard_buttons {
($vis:vis enum $name:ident {
$($variant:ident($text:literal, $callback_data:literal),)*
}) => {
keyboard_buttons! {
$vis enum $name {
[$($variant($text, $callback_data),)*]
}
}
};
($vis:vis enum $name:ident {
$([
$($variant:ident($text:literal, $callback_data:literal),)*
]),*
}) => {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
$vis enum $name {
$(
$($variant,)*
)*
}
impl $name {
#[allow(unused)]
pub fn to_keyboard() -> teloxide::types::InlineKeyboardMarkup {
let markup = teloxide::types::InlineKeyboardMarkup::default();
$(
let markup = markup.append_row([
$(
teloxide::types::InlineKeyboardButton::callback($text, $callback_data),
)*
]);
)*
markup
}
}
impl Into<teloxide::types::InlineKeyboardButton> for $name {
fn into(self) -> teloxide::types::InlineKeyboardButton {
match self {
$($(Self::$variant => teloxide::types::InlineKeyboardButton::callback($text, $callback_data)),*),*
}
}
}
impl<'a> TryFrom<&'a str> for $name {
type Error = &'a str;
fn try_from(value: &'a str) -> Result<Self, Self::Error> {
match value {
$($(
$callback_data => Ok(Self::$variant),
)*)*
_ => Err(value),
}
}
}
};
}
#[cfg(test)]
mod tests {
use teloxide::types::{InlineKeyboardButton, InlineKeyboardButtonKind};
use super::*;
keyboard_buttons! {
pub enum DurationKeyboardButtons {
OneDay("1 day", "duration_1_day"),
ThreeDays("3 days", "duration_3_days"),
SevenDays("7 days", "duration_7_days"),
FourteenDays("14 days", "duration_14_days"),
}
}
#[test]
fn test_duration_keyboard_buttons() {
let button: InlineKeyboardButton = DurationKeyboardButtons::OneDay.into();
assert_eq!(button.text, "1 day");
assert_eq!(
button.kind,
InlineKeyboardButtonKind::CallbackData("duration_1_day".to_string())
);
}
}