Skip to main content

twilight_model/channel/
flags.rs

1use bitflags::bitflags;
2use serde::{
3    de::{Deserialize, Deserializer},
4    ser::{Serialize, Serializer},
5};
6
7bitflags! {
8    #[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
9    pub struct ChannelFlags: u64 {
10        /// Channel is pinned in a forum.
11        const PINNED = 1 << 1;
12        /// New threads in a forum channel require a tag.
13        const REQUIRE_TAG = 1 << 4;
14        /// Hide the download options for this post in a media channel.
15        const HIDE_MEDIA_DOWNLOAD_OPTIONS = 1 << 15;
16        /// This channel's metadata has been obfuscated because the current user
17        /// cannot view it.
18        ///
19        /// Only ever set on channels received over the Gateway; the HTTP API
20        /// never sets this flag.
21        const CHANNEL_OBFUSCATED = 1 << 17;
22        /// This channel is a Spoiler Channel.
23        ///
24        /// Users must opt in to view its contents.
25        ///
26        /// Can be set on all textual guild channels and voice channels (but not stage channels). Can only be set if [`Channel::nsfw`] is false.
27        ///
28        /// [`Channel::nsfw`]: super::Channel::nsfw
29        const IS_SPOILER_CHANNEL = 1 << 21;
30    }
31}
32
33impl<'de> Deserialize<'de> for ChannelFlags {
34    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
35        Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
36    }
37}
38
39impl Serialize for ChannelFlags {
40    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41    where
42        S: Serializer,
43    {
44        serializer.serialize_u64(self.bits())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::ChannelFlags;
51    use serde::{Deserialize, Serialize};
52    use serde_test::Token;
53    use static_assertions::{assert_impl_all, const_assert_eq};
54    use std::{
55        fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
56        hash::Hash,
57        ops::{
58            BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
59        },
60    };
61
62    assert_impl_all!(
63        ChannelFlags: Binary,
64        BitAnd,
65        BitAndAssign,
66        BitOr,
67        BitOrAssign,
68        BitXor,
69        BitXorAssign,
70        Clone,
71        Copy,
72        Debug,
73        Deserialize<'static>,
74        Eq,
75        Extend<ChannelFlags>,
76        FromIterator<ChannelFlags>,
77        Hash,
78        LowerHex,
79        Not,
80        Octal,
81        PartialEq,
82        Send,
83        Serialize,
84        Sub,
85        SubAssign,
86        Sync,
87        UpperHex
88    );
89    const_assert_eq!(ChannelFlags::PINNED.bits(), 1 << 1);
90    const_assert_eq!(ChannelFlags::REQUIRE_TAG.bits(), 1 << 4);
91    const_assert_eq!(ChannelFlags::HIDE_MEDIA_DOWNLOAD_OPTIONS.bits(), 1 << 15);
92    const_assert_eq!(ChannelFlags::CHANNEL_OBFUSCATED.bits(), 1 << 17);
93    const_assert_eq!(ChannelFlags::IS_SPOILER_CHANNEL.bits(), 1 << 21);
94
95    #[test]
96    fn serde() {
97        serde_test::assert_tokens(
98            &ChannelFlags::PINNED,
99            &[Token::U64(ChannelFlags::PINNED.bits())],
100        );
101        // Deserialization truncates unknown bits.
102        serde_test::assert_de_tokens(&ChannelFlags::empty(), &[Token::U64(1 << 63)]);
103    }
104}