1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
4#[non_exhaustive]
5#[serde(from = "u8", into = "u8")]
6pub enum ChannelType {
7 GuildText,
8 Private,
9 GuildVoice,
10 Group,
11 GuildCategory,
12 GuildAnnouncement,
13 AnnouncementThread,
14 PublicThread,
15 PrivateThread,
16 GuildStageVoice,
17 GuildDirectory,
21 GuildForum,
23 GuildMedia,
29 Unknown(u8),
30}
31
32impl From<u8> for ChannelType {
33 fn from(value: u8) -> Self {
34 match value {
35 0 => ChannelType::GuildText,
36 1 => ChannelType::Private,
37 2 => ChannelType::GuildVoice,
38 3 => ChannelType::Group,
39 4 => ChannelType::GuildCategory,
40 5 => ChannelType::GuildAnnouncement,
41 10 => ChannelType::AnnouncementThread,
42 11 => ChannelType::PublicThread,
43 12 => ChannelType::PrivateThread,
44 13 => ChannelType::GuildStageVoice,
45 14 => ChannelType::GuildDirectory,
46 15 => ChannelType::GuildForum,
47 16 => ChannelType::GuildMedia,
48 unknown => ChannelType::Unknown(unknown),
49 }
50 }
51}
52
53impl From<ChannelType> for u8 {
54 fn from(value: ChannelType) -> Self {
55 match value {
56 ChannelType::GuildText => 0,
57 ChannelType::Private => 1,
58 ChannelType::GuildVoice => 2,
59 ChannelType::Group => 3,
60 ChannelType::GuildCategory => 4,
61 ChannelType::GuildAnnouncement => 5,
62 ChannelType::AnnouncementThread => 10,
63 ChannelType::PublicThread => 11,
64 ChannelType::PrivateThread => 12,
65 ChannelType::GuildStageVoice => 13,
66 ChannelType::GuildDirectory => 14,
67 ChannelType::GuildForum => 15,
68 ChannelType::GuildMedia => 16,
69 ChannelType::Unknown(unknown) => unknown,
70 }
71 }
72}
73
74impl ChannelType {
75 pub const fn is_guild(self) -> bool {
90 matches!(
91 self,
92 Self::GuildCategory
93 | Self::GuildDirectory
94 | Self::GuildAnnouncement
95 | Self::AnnouncementThread
96 | Self::PublicThread
97 | Self::PrivateThread
98 | Self::GuildStageVoice
99 | Self::GuildText
100 | Self::GuildVoice
101 | Self::GuildMedia
102 )
103 }
104
105 pub const fn is_thread(self) -> bool {
113 matches!(
114 self,
115 Self::AnnouncementThread | Self::PublicThread | Self::PrivateThread
116 )
117 }
118
119 pub const fn name(self) -> &'static str {
121 match self {
122 Self::AnnouncementThread => "AnnouncementThread",
123 Self::Group => "Group",
124 Self::GuildCategory => "GuildCategory",
125 Self::GuildDirectory => "GuildDirectory",
126 Self::GuildForum => "GuildForum",
127 Self::GuildAnnouncement => "GuildAnnouncement",
128 Self::GuildStageVoice => "GuildStageVoice",
129 Self::GuildText => "GuildText",
130 Self::GuildVoice => "GuildVoice",
131 Self::Private => "Private",
132 Self::PrivateThread => "PrivateThread",
133 Self::PublicThread => "PublicThread",
134 Self::GuildMedia => "GuildMedia",
135 Self::Unknown(_) => "Unknown",
136 }
137 }
138}
139
140#[cfg(test)]
141mod tests {
142 use super::ChannelType;
143 use serde_test::Token;
144 use static_assertions::const_assert;
145
146 const_assert!(ChannelType::GuildCategory.is_guild());
147 const_assert!(ChannelType::GuildDirectory.is_guild());
148 const_assert!(ChannelType::GuildAnnouncement.is_guild());
149 const_assert!(ChannelType::AnnouncementThread.is_guild());
150 const_assert!(ChannelType::PublicThread.is_guild());
151 const_assert!(ChannelType::PrivateThread.is_guild());
152 const_assert!(ChannelType::GuildStageVoice.is_guild());
153 const_assert!(ChannelType::GuildText.is_guild());
154 const_assert!(ChannelType::GuildVoice.is_guild());
155 const_assert!(ChannelType::GuildMedia.is_guild());
156
157 const_assert!(ChannelType::AnnouncementThread.is_thread());
158 const_assert!(ChannelType::PublicThread.is_thread());
159 const_assert!(ChannelType::PrivateThread.is_thread());
160
161 #[test]
162 fn variants() {
163 serde_test::assert_tokens(&ChannelType::GuildText, &[Token::U8(0)]);
164 serde_test::assert_tokens(&ChannelType::Private, &[Token::U8(1)]);
165 serde_test::assert_tokens(&ChannelType::GuildVoice, &[Token::U8(2)]);
166 serde_test::assert_tokens(&ChannelType::Group, &[Token::U8(3)]);
167 serde_test::assert_tokens(&ChannelType::GuildCategory, &[Token::U8(4)]);
168 serde_test::assert_tokens(&ChannelType::GuildAnnouncement, &[Token::U8(5)]);
169 serde_test::assert_tokens(&ChannelType::AnnouncementThread, &[Token::U8(10)]);
170 serde_test::assert_tokens(&ChannelType::PublicThread, &[Token::U8(11)]);
171 serde_test::assert_tokens(&ChannelType::PrivateThread, &[Token::U8(12)]);
172 serde_test::assert_tokens(&ChannelType::GuildStageVoice, &[Token::U8(13)]);
173 serde_test::assert_tokens(&ChannelType::GuildDirectory, &[Token::U8(14)]);
174 serde_test::assert_tokens(&ChannelType::GuildForum, &[Token::U8(15)]);
175 serde_test::assert_tokens(&ChannelType::GuildMedia, &[Token::U8(16)]);
176 serde_test::assert_tokens(&ChannelType::Unknown(99), &[Token::U8(99)]);
177 }
178
179 #[test]
180 fn names() {
181 assert_eq!("AnnouncementThread", ChannelType::AnnouncementThread.name());
182 assert_eq!("Group", ChannelType::Group.name());
183 assert_eq!("GuildCategory", ChannelType::GuildCategory.name());
184 assert_eq!("GuildDirectory", ChannelType::GuildDirectory.name());
185 assert_eq!("GuildAnnouncement", ChannelType::GuildAnnouncement.name());
186 assert_eq!("GuildStageVoice", ChannelType::GuildStageVoice.name());
187 assert_eq!("GuildText", ChannelType::GuildText.name());
188 assert_eq!("GuildVoice", ChannelType::GuildVoice.name());
189 assert_eq!("Private", ChannelType::Private.name());
190 assert_eq!("PrivateThread", ChannelType::PrivateThread.name());
191 assert_eq!("PublicThread", ChannelType::PublicThread.name());
192 assert_eq!("GuildMedia", ChannelType::GuildMedia.name());
193 assert_eq!("Unknown", ChannelType::Unknown(99).name());
194 }
195}