Files
pawctioneer-bot/src/keyboard_utils.rs
Dylan Knutson cf02bfd6d7 Major refactor: restructure new listing command and update data models
- Refactor new_listing from single file to modular structure
- Add handler factory pattern for state management
- Improve keyboard utilities and validations
- Update database models for bid, listing, and user systems
- Add new types: listing_duration, user_row_id
- Remove deprecated user_id type
- Update Docker configuration
- Enhance test utilities and message handling
2025-08-29 06:31:19 +00:00

82 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)]
$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};
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())
);
}
}