use std::collections::HashMap;
use crate::types::{
ApplicationIntegrationType, ChannelType, InteractionContextType, Permissions, Snowflake,
TypeField,
};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize)]
#[serde(untagged)]
pub enum ApplicationCommand {
ChatInputCommand(ChatInputCommand<1>),
UserCommand(CommandDetails<2>),
MessageCommand(CommandDetails<3>),
}
impl ApplicationCommand {
pub fn as_chat_input_command(&self) -> Option<&ChatInputCommand<1>> {
if let Self::ChatInputCommand(v) = self {
Some(v)
} else {
None
}
}
pub fn as_user_command(&self) -> Option<&CommandDetails<2>> {
if let Self::UserCommand(v) = self {
Some(v)
} else {
None
}
}
pub fn as_message_command(&self) -> Option<&CommandDetails<3>> {
if let Self::MessageCommand(v) = self {
Some(v)
} else {
None
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CommandDetails<const T: u8> {
#[serde(rename = "type")]
pub t: TypeField<T>,
#[serde(skip_serializing)]
pub id: Option<Snowflake>,
#[serde(skip_serializing)]
pub application_id: Option<Snowflake>,
#[serde(skip_serializing_if = "Option::is_none")]
pub guild_id: Option<Snowflake>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default_member_permissions: Option<Permissions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dm_permission: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub integration_types: Option<Vec<ApplicationIntegrationType>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub contexts: Option<Vec<InteractionContextType>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nsfw: Option<bool>,
#[serde(skip_serializing)]
pub version: Option<Snowflake>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatInputCommand<const T: u8> {
#[serde(flatten)]
pub details: CommandDetails<T>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<Vec<ApplicationCommandOption>>,
}
pub type BooleanOption = BaseOption<5>;
pub type UserOption = BaseOption<6>;
pub type RoleOption = BaseOption<8>;
pub type MentionableOption = BaseOption<9>;
pub type AttachmentOption = BaseOption<11>;
#[derive(Debug, Clone, Serialize)]
#[serde(untagged)]
pub enum ApplicationCommandOption {
Subcommand(SubcommandOption),
SubcommandGroup(SubcommandGroupOption),
String(StringOption),
Integer(IntegerOption),
Boolean(BooleanOption),
User(UserOption),
Channel(ChannelOption),
Role(RoleOption),
Mentionable(MentionableOption),
Number(NumberOption),
Attachment(AttachmentOption),
}
#[derive(Debug, Clone, Serialize)]
#[serde(untagged)]
pub enum SubcommandCommandOption {
String(StringOption),
Integer(IntegerOption),
Boolean(BooleanOption),
User(UserOption),
Channel(ChannelOption),
Role(RoleOption),
Mentionable(MentionableOption),
Number(NumberOption),
Attachment(AttachmentOption),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubcommandOption {
#[serde(rename = "type")]
pub t: TypeField<1>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<Vec<SubcommandCommandOption>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SubcommandGroupOption {
#[serde(rename = "type")]
pub t: TypeField<2>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub options: Option<Vec<SubcommandOption>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StringOption {
#[serde(rename = "type")]
pub t: TypeField<3>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub choices: Option<Vec<ApplicationCommandOptionChoice<String>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_length: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_length: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autocomplete: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IntegerOption {
#[serde(rename = "type")]
pub t: TypeField<4>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub choices: Option<Vec<ApplicationCommandOptionChoice<i64>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_value: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_value: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autocomplete: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NumberOption {
#[serde(rename = "type")]
pub t: TypeField<10>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub choices: Option<Vec<ApplicationCommandOptionChoice<f64>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub min_value: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_value: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub autocomplete: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BaseOption<const T: u8> {
#[serde(rename = "type")]
pub t: TypeField<T>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChannelOption {
#[serde(rename = "type")]
pub t: TypeField<7>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description_localizations: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channel_types: Option<Vec<ChannelType>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplicationCommandOptionChoice<T> {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name_localizations: Option<HashMap<String, String>>,
pub value: T,
}