- 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
82 lines
2.5 KiB
Rust
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())
|
|
);
|
|
}
|
|
}
|