twilight_model/channel/message/component/
select_menu.rs1use crate::channel::{ChannelType, message::EmojiReactionType};
2use crate::id::Id;
3use crate::id::marker::{ChannelMarker, RoleMarker, UserMarker};
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, Eq, Hash, PartialEq)]
10pub struct SelectMenu {
11 pub id: Option<i32>,
13 pub channel_types: Option<Vec<ChannelType>>,
17 pub custom_id: String,
19 pub default_values: Option<Vec<SelectDefaultValue>>,
21 pub disabled: bool,
25 pub kind: SelectMenuType,
27 pub max_values: Option<u8>,
29 pub min_values: Option<u8>,
31 pub options: Option<Vec<SelectMenuOption>>,
35 pub placeholder: Option<String>,
37 pub required: Option<bool>,
41}
42
43#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
45#[non_exhaustive]
46pub enum SelectMenuType {
47 Text,
52 User,
54 Role,
56 Mentionable,
58 Channel,
60}
61
62#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
64pub struct SelectMenuOption {
65 #[serde(default)]
67 pub default: bool,
68 #[serde(skip_serializing_if = "Option::is_none")]
70 pub description: Option<String>,
71 #[serde(skip_serializing_if = "Option::is_none")]
74 pub emoji: Option<EmojiReactionType>,
75 pub label: String,
77 pub value: String,
79}
80
81#[derive(Copy, Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
83#[serde(tag = "type", content = "id", rename_all = "snake_case")]
84pub enum SelectDefaultValue {
85 User(Id<UserMarker>),
87 Role(Id<RoleMarker>),
89 Channel(Id<ChannelMarker>),
91}
92
93#[cfg(test)]
94mod tests {
95 use super::*;
96 use static_assertions::{assert_fields, assert_impl_all};
97 use std::{fmt::Debug, hash::Hash};
98
99 assert_fields!(
100 SelectMenu: channel_types,
101 custom_id,
102 default_values,
103 disabled,
104 kind,
105 max_values,
106 min_values,
107 options,
108 placeholder,
109 required
110 );
111 assert_impl_all!(SelectMenu: Clone, Debug, Eq, Hash, PartialEq, Send, Sync);
112
113 assert_impl_all!(
114 SelectMenuType: Clone,
115 Debug,
116 Eq,
117 Hash,
118 PartialEq,
119 Send,
120 Sync
121 );
122
123 assert_impl_all!(
124 SelectMenuOption: Clone,
125 Debug,
126 Deserialize<'static>,
127 Eq,
128 Hash,
129 PartialEq,
130 Send,
131 Serialize,
132 Sync
133 );
134 assert_fields!(SelectMenuOption: default, description, emoji, label, value);
135
136 assert_impl_all!(
137 SelectDefaultValue: Copy,
138 Clone,
139 Debug,
140 Deserialize<'static>,
141 Eq,
142 Hash,
143 Ord,
144 PartialEq,
145 PartialOrd,
146 Serialize
147 );
148}