twilight_model/channel/
channel_type.rs

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    /// Channel in a [hub] containing the listed servers.
18    ///
19    /// [hub]: https://support.discord.com/hc/en-us/articles/4406046651927-Discord-Student-Hubs-FAQ
20    GuildDirectory,
21    /// Channel that can only contain threads.
22    GuildForum,
23    /// Channel the can only contain threads with media content.
24    ///
25    /// See the [help center article] for more information.
26    ///
27    /// [help center article]: https://creator-support.discord.com/hc/en-us/articles/14346342766743
28    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    /// Whether the channel type is that of a guild.
76    ///
77    /// The following channel types are considered guild channel types:
78    ///
79    /// - [`AnnouncementThread`][`Self::AnnouncementThread`]
80    /// - [`GuildAnnouncement`][`Self::GuildAnnouncement`]
81    /// - [`GuildCategory`][`Self::GuildCategory`]
82    /// - [`GuildDirectory`][`Self::GuildDirectory`]
83    /// - [`GuildStageVoice`][`Self::GuildStageVoice`]
84    /// - [`GuildText`][`Self::GuildText`]
85    /// - [`GuildVoice`][`Self::GuildVoice`]
86    /// - [`PublicThread`][`Self::PublicThread`]
87    /// - [`PrivateThread`][`Self::PrivateThread`]
88    /// - [`GuildMedia`][`Self::GuildMedia`]
89    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    /// Whether the channel type is a thread.
106    ///
107    /// The following channel types are considered guild channel types:
108    ///
109    /// - [`AnnouncementThread`][`Self::AnnouncementThread`]
110    /// - [`PrivateThread`][`Self::PrivateThread`]
111    /// - [`PublicThread`][`Self::PublicThread`]
112    pub const fn is_thread(self) -> bool {
113        matches!(
114            self,
115            Self::AnnouncementThread | Self::PublicThread | Self::PrivateThread
116        )
117    }
118
119    /// Name of the variant as a string slice.
120    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}