use serde::{Deserialize, Serialize};
use crate::types::{LoginUrl, RichText, SwitchInlineQueryChosenChat, WebAppInfo};
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RichMessageButtonStyle {
Danger,
Success,
Primary,
Link,
}
#[serde_with::skip_serializing_none]
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RichMessageButton {
pub text: RichText,
#[serde(flatten)]
pub button_type: RichMessageButtonType,
pub style: Option<RichMessageButtonStyle>,
}
impl<T> From<(T, RichMessageButtonType)> for RichMessageButton
where
T: Into<RichText>,
{
fn from((text, button_type): (T, RichMessageButtonType)) -> Self {
Self {
text: text.into(),
button_type,
style: None,
}
}
}
impl RichMessageButton {
pub fn with_style(mut self, value: RichMessageButtonStyle) -> Self {
self.style = Some(value);
self
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum RichMessageButtonType {
CallbackData(String),
CopyText {
text: String,
},
Disabled {},
LoginUrl(LoginUrl),
SwitchInlineQuery(String),
SwitchInlineQueryCurrentChat(String),
SwitchInlineQueryChosenChat(SwitchInlineQueryChosenChat),
Url(String),
WebApp(WebAppInfo),
}