twilight_model/guild/
system_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 SystemChannelFlags: u64 {
10        /// Suppress member join notifications.
11        const SUPPRESS_JOIN_NOTIFICATIONS = 1;
12        /// Suppress server boost notifications.
13        const SUPPRESS_PREMIUM_SUBSCRIPTIONS = 1 << 1;
14        /// Suppress server setup tips.
15        const SUPPRESS_GUILD_REMINDER_NOTIFICATIONS = 1 << 2;
16        /// Hide member join sticker reply buttons.
17        const SUPPRESS_JOIN_NOTIFICATION_REPLIES = 1 << 3;
18        /// Suppress role subscription purchase and renewal notifications.
19        const SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATIONS = 1 << 4;
20        /// Hide role subscription sticker reply buttons.
21        const SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATION_REPLIES = 1 << 5;
22    }
23}
24
25impl<'de> Deserialize<'de> for SystemChannelFlags {
26    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
27        Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
28    }
29}
30
31impl Serialize for SystemChannelFlags {
32    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
33    where
34        S: Serializer,
35    {
36        serializer.serialize_u64(self.bits())
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::SystemChannelFlags;
43    use serde::{Deserialize, Serialize};
44    use serde_test::Token;
45    use static_assertions::{assert_impl_all, const_assert_eq};
46    use std::{
47        fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
48        hash::Hash,
49        ops::{
50            BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
51        },
52    };
53
54    assert_impl_all!(
55        SystemChannelFlags: Binary,
56        BitAnd,
57        BitAndAssign,
58        BitOr,
59        BitOrAssign,
60        BitXor,
61        BitXorAssign,
62        Clone,
63        Copy,
64        Debug,
65        Deserialize<'static>,
66        Eq,
67        Extend<SystemChannelFlags>,
68        FromIterator<SystemChannelFlags>,
69        Hash,
70        LowerHex,
71        Not,
72        Octal,
73        PartialEq,
74        Send,
75        Serialize,
76        Sub,
77        SubAssign,
78        Sync,
79        UpperHex
80    );
81    const_assert_eq!(SystemChannelFlags::SUPPRESS_JOIN_NOTIFICATIONS.bits(), 1);
82    const_assert_eq!(
83        SystemChannelFlags::SUPPRESS_PREMIUM_SUBSCRIPTIONS.bits(),
84        1 << 1
85    );
86    const_assert_eq!(
87        SystemChannelFlags::SUPPRESS_GUILD_REMINDER_NOTIFICATIONS.bits(),
88        1 << 2
89    );
90    const_assert_eq!(
91        SystemChannelFlags::SUPPRESS_JOIN_NOTIFICATION_REPLIES.bits(),
92        1 << 3
93    );
94    const_assert_eq!(
95        SystemChannelFlags::SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATIONS.bits(),
96        1 << 4
97    );
98    const_assert_eq!(
99        SystemChannelFlags::SUPPRESS_ROLE_SUBSCRIPTION_PURCHASE_NOTIFICATION_REPLIES.bits(),
100        1 << 5
101    );
102
103    #[test]
104    fn serde() {
105        serde_test::assert_tokens(
106            &SystemChannelFlags::SUPPRESS_JOIN_NOTIFICATION_REPLIES,
107            &[Token::U64(
108                SystemChannelFlags::SUPPRESS_JOIN_NOTIFICATION_REPLIES.bits(),
109            )],
110        );
111        // Deserialization truncates unknown bits.
112        serde_test::assert_de_tokens(&SystemChannelFlags::empty(), &[Token::U64(1 << 63)]);
113    }
114}