twilight_model/user/
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 UserFlags: u64 {
10        /// Discord Employee.
11        const STAFF = 1;
12        /// Partnered server owner.
13        const PARTNER = 1 << 1;
14        /// HypeSquad events member.
15        const HYPESQUAD = 1 << 2;
16        /// Bug hunter level 1.
17        const BUG_HUNTER_LEVEL_1 = 1 << 3;
18        /// House Bravery member.
19        const HYPESQUAD_ONLINE_HOUSE_1 = 1 << 6;
20        /// House Brilliance member.
21        const HYPESQUAD_ONLINE_HOUSE_2 = 1 << 7;
22        /// House Balance member.
23        const HYPESQUAD_ONLINE_HOUSE_3 = 1 << 8;
24        /// Early Nitro supporter.
25        const PREMIUM_EARLY_SUPPORTER = 1 << 9;
26        /// User is in a team.
27        const TEAM_PSEUDO_USER = 1 << 10;
28        /// Bug hunter level 2.
29        const BUG_HUNTER_LEVEL_2 = 1 << 14;
30        /// Verified bot.
31        const VERIFIED_BOT = 1 << 16;
32        /// Early verified bot developer.
33        const VERIFIED_DEVELOPER = 1 << 17;
34        /// Moderator Programs Alumni
35        const MODERATOR_PROGRAMS_ALUMNI = 1 << 18;
36        /// Bot uses only HTTP interactions and is shown in the online member
37        /// list.
38        const BOT_HTTP_INTERACTIONS = 1 << 19;
39        /// User is an [Active Developer].
40        ///
41        /// [Active Developer]: https://support-dev.discord.com/hc/articles/10113997751447
42        const ACTIVE_DEVELOPER = 1 << 22;
43    }
44}
45
46impl<'de> Deserialize<'de> for UserFlags {
47    fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
48        Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
49    }
50}
51
52impl Serialize for UserFlags {
53    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
54    where
55        S: Serializer,
56    {
57        serializer.serialize_u64(self.bits())
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    #![allow(deprecated)]
64
65    use super::UserFlags;
66    use serde::{Deserialize, Serialize};
67    use serde_test::Token;
68    use static_assertions::{assert_impl_all, const_assert_eq};
69    use std::{
70        fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
71        hash::Hash,
72        ops::{
73            BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
74        },
75    };
76
77    assert_impl_all!(
78        UserFlags: Binary,
79        BitAnd,
80        BitAndAssign,
81        BitOr,
82        BitOrAssign,
83        BitXor,
84        BitXorAssign,
85        Clone,
86        Copy,
87        Debug,
88        Deserialize<'static>,
89        Eq,
90        Extend<UserFlags>,
91        FromIterator<UserFlags>,
92        Hash,
93        LowerHex,
94        Not,
95        Octal,
96        PartialEq,
97        Send,
98        Serialize,
99        Sub,
100        SubAssign,
101        Sync,
102        UpperHex
103    );
104
105    const_assert_eq!(UserFlags::STAFF.bits(), 1);
106    const_assert_eq!(UserFlags::PARTNER.bits(), 1 << 1);
107    const_assert_eq!(UserFlags::HYPESQUAD.bits(), 1 << 2);
108    const_assert_eq!(UserFlags::BUG_HUNTER_LEVEL_1.bits(), 1 << 3);
109    const_assert_eq!(UserFlags::HYPESQUAD_ONLINE_HOUSE_1.bits(), 1 << 6);
110    const_assert_eq!(UserFlags::HYPESQUAD_ONLINE_HOUSE_2.bits(), 1 << 7);
111    const_assert_eq!(UserFlags::HYPESQUAD_ONLINE_HOUSE_3.bits(), 1 << 8);
112    const_assert_eq!(UserFlags::PREMIUM_EARLY_SUPPORTER.bits(), 1 << 9);
113    const_assert_eq!(UserFlags::TEAM_PSEUDO_USER.bits(), 1 << 10);
114    const_assert_eq!(UserFlags::BUG_HUNTER_LEVEL_2.bits(), 1 << 14);
115    const_assert_eq!(UserFlags::VERIFIED_BOT.bits(), 1 << 16);
116    const_assert_eq!(UserFlags::VERIFIED_DEVELOPER.bits(), 1 << 17);
117    const_assert_eq!(UserFlags::MODERATOR_PROGRAMS_ALUMNI.bits(), 1 << 18);
118    const_assert_eq!(UserFlags::BOT_HTTP_INTERACTIONS.bits(), 1 << 19);
119    const_assert_eq!(UserFlags::ACTIVE_DEVELOPER.bits(), 1 << 22);
120
121    #[test]
122    fn serde() {
123        serde_test::assert_tokens(
124            &UserFlags::PARTNER,
125            &[Token::U64(UserFlags::PARTNER.bits())],
126        );
127        // Deserialization truncates unknown bits.
128        serde_test::assert_de_tokens(&UserFlags::empty(), &[Token::U64(1 << 63)]);
129    }
130}