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 channel_types: Option<Vec<ChannelType>>,
15 pub custom_id: String,
17 pub default_values: Option<Vec<SelectDefaultValue>>,
19 pub disabled: bool,
23 pub kind: SelectMenuType,
25 pub max_values: Option<u8>,
27 pub min_values: Option<u8>,
29 pub options: Option<Vec<SelectMenuOption>>,
33 pub placeholder: Option<String>,
35}
36
37#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
39#[non_exhaustive]
40pub enum SelectMenuType {
41 Text,
46 User,
48 Role,
50 Mentionable,
52 Channel,
54}
55
56#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
58pub struct SelectMenuOption {
59 #[serde(default)]
61 pub default: bool,
62 #[serde(skip_serializing_if = "Option::is_none")]
64 pub description: Option<String>,
65 #[serde(skip_serializing_if = "Option::is_none")]
68 pub emoji: Option<EmojiReactionType>,
69 pub label: String,
71 pub value: String,
73}
74
75#[derive(Copy, Clone, Debug, Deserialize, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
77#[serde(tag = "type", content = "id", rename_all = "snake_case")]
78pub enum SelectDefaultValue {
79 User(Id<UserMarker>),
81 Role(Id<RoleMarker>),
83 Channel(Id<ChannelMarker>),
85}
86
87#[cfg(test)]
88mod tests {
89 use super::*;
90 use static_assertions::{assert_fields, assert_impl_all};
91 use std::{fmt::Debug, hash::Hash};
92
93 assert_fields!(
94 SelectMenu: channel_types,
95 custom_id,
96 default_values,
97 disabled,
98 kind,
99 max_values,
100 min_values,
101 options,
102 placeholder
103 );
104 assert_impl_all!(SelectMenu: Clone, Debug, Eq, Hash, PartialEq, Send, Sync);
105
106 assert_impl_all!(
107 SelectMenuType: Clone,
108 Debug,
109 Eq,
110 Hash,
111 PartialEq,
112 Send,
113 Sync
114 );
115
116 assert_impl_all!(
117 SelectMenuOption: Clone,
118 Debug,
119 Deserialize<'static>,
120 Eq,
121 Hash,
122 PartialEq,
123 Send,
124 Serialize,
125 Sync
126 );
127 assert_fields!(SelectMenuOption: default, description, emoji, label, value);
128
129 assert_impl_all!(
130 SelectDefaultValue: Copy,
131 Clone,
132 Debug,
133 Deserialize<'static>,
134 Eq,
135 Hash,
136 Ord,
137 PartialEq,
138 PartialOrd,
139 Serialize
140 );
141}