use std::collections::HashMap;
use twilight_model::{
application::command::{
CommandOption, CommandOptionChoice, CommandOptionType, CommandOptionValue,
},
channel::ChannelType,
};
use super::{DescLocalizations, NameLocalizations};
#[derive(Debug, Clone, PartialEq)]
pub struct LocalizationsInternal {
pub fallback: String,
pub localizations: Option<HashMap<String, String>>,
}
pub trait IntoLocalizationsInternal {
fn into_localizations(self) -> LocalizationsInternal;
}
impl IntoLocalizationsInternal for DescLocalizations {
fn into_localizations(self) -> LocalizationsInternal {
LocalizationsInternal {
fallback: self.fallback,
localizations: Some(self.localizations),
}
}
}
impl IntoLocalizationsInternal for (&str, Option<NameLocalizations>) {
fn into_localizations(self) -> LocalizationsInternal {
LocalizationsInternal {
fallback: self.0.to_owned(),
localizations: self.1.map(|v| v.localizations),
}
}
}
impl IntoLocalizationsInternal for &str {
fn into_localizations(self) -> LocalizationsInternal {
LocalizationsInternal {
fallback: self.to_owned(),
localizations: None,
}
}
}
#[derive(Debug, Clone, PartialEq)]
pub struct CreateOptionData {
pub name: String,
pub name_localizations: Option<HashMap<String, String>>,
pub description: String,
pub description_localizations: Option<HashMap<String, String>>,
pub required: Option<bool>,
pub autocomplete: bool,
pub data: CommandOptionData,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct CommandOptionData {
pub channel_types: Option<Vec<ChannelType>>,
pub max_value: Option<CommandOptionValue>,
pub min_value: Option<CommandOptionValue>,
pub max_length: Option<u16>,
pub min_length: Option<u16>,
}
pub struct CreateOptionBuilder {
kind: CommandOptionType,
option: CreateOptionData,
choices: Option<Vec<CommandOptionChoice>>,
options: Option<Vec<CommandOption>>,
}
impl CreateOptionBuilder {
pub fn new(option: CreateOptionData, kind: CommandOptionType) -> Self {
Self {
kind,
option,
choices: None,
options: None,
}
}
pub fn choices(mut self, choices: Vec<CommandOptionChoice>) -> Self {
self.choices = Some(choices);
self
}
pub fn options(mut self, options: Vec<CommandOption>) -> Self {
self.options = Some(options);
self
}
pub fn build(self) -> CommandOption {
CommandOption {
autocomplete: Some(self.option.autocomplete),
channel_types: self.option.data.channel_types,
choices: self.choices,
description: self.option.description,
description_localizations: self.option.description_localizations,
kind: self.kind,
max_length: self.option.data.max_length,
max_value: self.option.data.max_value,
min_length: self.option.data.min_length,
min_value: self.option.data.min_value,
name: self.option.name,
name_localizations: self.option.name_localizations,
options: self.options,
required: self.option.required,
}
}
}
impl CreateOptionData {
pub fn builder(self, kind: CommandOptionType) -> CreateOptionBuilder {
CreateOptionBuilder::new(self, kind)
}
pub fn into_option(self, kind: CommandOptionType) -> CommandOption {
self.builder(kind).build()
}
}