twilight_model/channel/message/component/
select_menu.rs1use crate::channel::{message::EmojiReactionType, ChannelType};
2use crate::id::marker::{ChannelMarker, RoleMarker, UserMarker};
3use crate::id::Id;
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}
38
39#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
41#[non_exhaustive]
42pub enum SelectMenuType {
43 Text,
48 User,
50 Role,
52 Mentionable,
54 Channel,
56}
57
58#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
60pub struct SelectMenuOption {
61 #[serde(default)]
63 pub default: bool,
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub description: Option<String>,
67 #[serde(skip_serializing_if = "Option::is_none")]
70 pub emoji: Option<EmojiReactionType>,
71 pub label: String,
73 pub value: String,
75}
76
77#[derive(Copy, Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
79#[serde(tag = "type", content = "id", rename_all = "snake_case")]
80pub enum SelectDefaultValue {
81 User(Id<UserMarker>),
83 Role(Id<RoleMarker>),
85 Channel(Id<ChannelMarker>),
87}
88
89#[cfg(test)]
90mod tests {
91 use super::*;
92 use static_assertions::{assert_fields, assert_impl_all};
93 use std::{fmt::Debug, hash::Hash};
94
95 assert_fields!(
96 SelectMenu: channel_types,
97 custom_id,
98 default_values,
99 disabled,
100 kind,
101 max_values,
102 min_values,
103 options,
104 placeholder
105 );
106 assert_impl_all!(SelectMenu: Clone, Debug, Eq, Hash, PartialEq, Send, Sync);
107
108 assert_impl_all!(
109 SelectMenuType: Clone,
110 Debug,
111 Eq,
112 Hash,
113 PartialEq,
114 Send,
115 Sync
116 );
117
118 assert_impl_all!(
119 SelectMenuOption: Clone,
120 Debug,
121 Deserialize<'static>,
122 Eq,
123 Hash,
124 PartialEq,
125 Send,
126 Serialize,
127 Sync
128 );
129 assert_fields!(SelectMenuOption: default, description, emoji, label, value);
130
131 assert_impl_all!(
132 SelectDefaultValue: Copy,
133 Clone,
134 Debug,
135 Deserialize<'static>,
136 Eq,
137 Hash,
138 Ord,
139 PartialEq,
140 PartialOrd,
141 Serialize
142 );
143}