use crate::messages::discord::{DiscordChannelType, DiscordPartialEmoji, DiscordSnowflake};
use serde::{Deserialize, Serialize};
use super::meta::DiscordMentions;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordActionRowComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub components: Vec<DiscordActionRowChild>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(untagged)]
pub enum DiscordActionRowChild {
Button(DiscordButtonComponent),
StringSelect(DiscordStringSelectComponent),
UserSelect(DiscordSelectComponent),
RoleSelect(DiscordSelectComponent),
MentionableSelect(DiscordSelectComponent),
ChannelSelect(DiscordChannelSelectComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordButtonComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
#[serde(flatten)]
pub kind: DiscordButtonKind,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "style")]
pub enum DiscordButtonKind {
#[serde(rename = "1")]
Primary {
label: Option<String>,
emoji: Option<DiscordPartialEmoji>,
custom_id: String,
},
#[serde(rename = "2")]
Secondary {
label: Option<String>,
emoji: Option<DiscordPartialEmoji>,
custom_id: String,
},
#[serde(rename = "3")]
Success {
label: Option<String>,
emoji: Option<DiscordPartialEmoji>,
custom_id: String,
},
#[serde(rename = "4")]
Danger {
label: Option<String>,
emoji: Option<DiscordPartialEmoji>,
custom_id: String,
},
#[serde(rename = "5")]
Link {
label: Option<String>,
emoji: Option<DiscordPartialEmoji>,
url: String,
},
#[serde(rename = "6")]
Premium { sku_id: DiscordSnowflake },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordStringSelectComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
pub options: Vec<DiscordSelectOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordTextInputComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
pub style: DiscordTextInputStyle,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_values: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_values: Option<u16>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum DiscordTextInputStyle {
#[serde(rename = "1")]
Short,
#[serde(rename = "2")]
Paragraph,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordSelectComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_values: Option<Vec<DiscordSelectDefaultValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordChannelSelectComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_types: Option<Vec<DiscordChannelType>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_values: Option<Vec<DiscordSelectDefaultValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordSelectDefaultValue {
pub id: DiscordSnowflake,
pub r#type: DiscordMentions,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordSelectOption {
pub label: String,
pub value: String,
pub description: Option<String>,
pub emoji: Option<DiscordPartialEmoji>,
pub default: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DiscordSectionComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub components: Vec<DiscordTextDisplayComponent>,
pub accessory: Vec<DiscordSectionAccessory>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordTextDisplayComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum DiscordSectionAccessory {
Button(DiscordButtonComponent),
Thumbnail(DiscordThumbnailComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordThumbnailComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub media: DiscordUnfurledMediaItem,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordUnfurledMediaItem {
pub url: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub proxy_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub height: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub width: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub placeholder_version: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub flags: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub attachment_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DiscordMediaGalleryComponent {
#[serde(rename = "type")]
pub kind: u8,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub items: Vec<DiscordMediaGalleryItem>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DiscordMediaGalleryItem {
pub media: DiscordUnfurledMediaItem,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordSeparatorComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub divider: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spacing: Option<DiscordSeparatorPadding>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum DiscordSeparatorPadding {
#[serde(rename = "1")]
Small,
#[serde(rename = "2")]
Large,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordFileComponent {
#[serde(rename = "type")]
pub kind: u8,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub file: DiscordUnfurledMediaItem,
#[serde(skip_serializing_if = "Option::is_none")]
pub spoiler: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DiscordContainerComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub components: Vec<DiscordContainerComponentChild>,
pub accent_color: Option<u64>,
pub spoiler: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub enum DiscordContainerComponentChild {
ActionRow(DiscordActionRowComponent),
TextDisplay(DiscordTextDisplayComponent),
Section(DiscordSectionComponent),
MediaGallery(DiscordMediaGalleryComponent),
Separator(DiscordSeparatorComponent),
File(DiscordFileComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DiscordLabelComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub component: DiscordLabelChildComponent,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(tag = "type")]
pub enum DiscordLabelChildComponent {
#[serde(rename = "4")]
TextInput(DiscordTextInputComponent),
#[serde(rename = "3")]
StringSelect(DiscordStringSelectComponent),
#[serde(rename = "5")]
UserSelect(DiscordSelectComponent),
#[serde(rename = "6")]
RoleSelect(DiscordSelectComponent),
#[serde(rename = "7")]
MentionableSelect(DiscordSelectComponent),
#[serde(rename = "8")]
ChannelSelect(DiscordChannelSelectComponent),
#[serde(rename = "19")]
FileUpload(DiscordFileUploadComponent),
#[serde(rename = "21")]
RadioGroup(DiscordRadioGroupComponent),
#[serde(rename = "22")]
CheckboxGroup(DiscordCheckboxGroupComponent),
#[serde(rename = "23")]
Checkbox(DiscordCheckboxComponent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordRadioGroupComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
pub options: Vec<DiscordRadioGroupOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordRadioGroupOption {
pub value: String,
pub label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordFileUploadComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordCheckboxGroupComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
pub options: Vec<DiscordCheckboxGroupOption>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_values: Option<u8>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordCheckboxGroupOption {
pub value: String,
pub label: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiscordCheckboxComponent {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<u32>,
pub custom_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum DiscordComponent {
#[serde(rename = "1")]
ActionRow(DiscordActionRowComponent),
#[serde(rename = "2")]
Button(DiscordButtonComponent),
#[serde(rename = "3")]
StringSelect(DiscordStringSelectComponent),
#[serde(rename = "4")]
TextInput(DiscordTextInputComponent),
#[serde(rename = "5")]
UserSelect(DiscordSelectComponent),
#[serde(rename = "6")]
RoleSelect(DiscordSelectComponent),
#[serde(rename = "7")]
MentionableSelect(DiscordSelectComponent),
#[serde(rename = "8")]
ChannelSelect(DiscordChannelSelectComponent),
#[serde(rename = "9")]
Section(DiscordSectionComponent),
#[serde(rename = "10")]
TextDisplay(DiscordTextDisplayComponent),
#[serde(rename = "11")]
Thumbnail(DiscordThumbnailComponent),
#[serde(rename = "12")]
MediaGallery(DiscordMediaGalleryComponent),
#[serde(rename = "13")]
File(DiscordFileComponent),
#[serde(rename = "14")]
Separator(DiscordSeparatorComponent),
#[serde(rename = "17")]
Container(DiscordContainerComponent),
#[serde(rename = "18")]
Label(DiscordLabelComponent),
#[serde(rename = "19")]
FileUpload(DiscordFileUploadComponent),
#[serde(rename = "21")]
RadioGroup(DiscordRadioGroupComponent),
#[serde(rename = "22")]
CheckboxGroup(DiscordCheckboxGroupComponent),
#[serde(rename = "23")]
Checkbox(DiscordCheckboxComponent),
}