twilight_model/user/
flags.rs1use 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 const STAFF = 1;
12 const PARTNER = 1 << 1;
14 const HYPESQUAD = 1 << 2;
16 const BUG_HUNTER_LEVEL_1 = 1 << 3;
18 const HYPESQUAD_ONLINE_HOUSE_1 = 1 << 6;
20 const HYPESQUAD_ONLINE_HOUSE_2 = 1 << 7;
22 const HYPESQUAD_ONLINE_HOUSE_3 = 1 << 8;
24 const PREMIUM_EARLY_SUPPORTER = 1 << 9;
26 const TEAM_PSEUDO_USER = 1 << 10;
28 const BUG_HUNTER_LEVEL_2 = 1 << 14;
30 const VERIFIED_BOT = 1 << 16;
32 const VERIFIED_DEVELOPER = 1 << 17;
34 #[deprecated(since = "0.17.2", note = "renamed to CERTIFIED_MODERATOR")]
36 #[doc(hidden)]
37 const MODERATOR_PROGRAMS_ALUMNI = 1 << 18;
38 const CERTIFIED_MODERATOR = 1 << 18;
40 const BOT_HTTP_INTERACTIONS = 1 << 19;
43 const ACTIVE_DEVELOPER = 1 << 22;
47 }
48}
49
50impl<'de> Deserialize<'de> for UserFlags {
51 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
52 Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
53 }
54}
55
56impl Serialize for UserFlags {
57 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
58 where
59 S: Serializer,
60 {
61 serializer.serialize_u64(self.bits())
62 }
63}
64
65#[cfg(test)]
66mod tests {
67 #![allow(deprecated)]
68
69 use super::UserFlags;
70 use serde::{Deserialize, Serialize};
71 use serde_test::Token;
72 use static_assertions::{assert_impl_all, const_assert_eq};
73 use std::{
74 fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
75 hash::Hash,
76 ops::{
77 BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
78 },
79 };
80
81 assert_impl_all!(
82 UserFlags: Binary,
83 BitAnd,
84 BitAndAssign,
85 BitOr,
86 BitOrAssign,
87 BitXor,
88 BitXorAssign,
89 Clone,
90 Copy,
91 Debug,
92 Deserialize<'static>,
93 Eq,
94 Extend<UserFlags>,
95 FromIterator<UserFlags>,
96 Hash,
97 LowerHex,
98 Not,
99 Octal,
100 PartialEq,
101 Send,
102 Serialize,
103 Sub,
104 SubAssign,
105 Sync,
106 UpperHex
107 );
108
109 const_assert_eq!(UserFlags::STAFF.bits(), 1);
110 const_assert_eq!(UserFlags::PARTNER.bits(), 1 << 1);
111 const_assert_eq!(UserFlags::HYPESQUAD.bits(), 1 << 2);
112 const_assert_eq!(UserFlags::BUG_HUNTER_LEVEL_1.bits(), 1 << 3);
113 const_assert_eq!(UserFlags::HYPESQUAD_ONLINE_HOUSE_1.bits(), 1 << 6);
114 const_assert_eq!(UserFlags::HYPESQUAD_ONLINE_HOUSE_2.bits(), 1 << 7);
115 const_assert_eq!(UserFlags::HYPESQUAD_ONLINE_HOUSE_3.bits(), 1 << 8);
116 const_assert_eq!(UserFlags::PREMIUM_EARLY_SUPPORTER.bits(), 1 << 9);
117 const_assert_eq!(UserFlags::TEAM_PSEUDO_USER.bits(), 1 << 10);
118 const_assert_eq!(UserFlags::BUG_HUNTER_LEVEL_2.bits(), 1 << 14);
119 const_assert_eq!(UserFlags::VERIFIED_BOT.bits(), 1 << 16);
120 const_assert_eq!(UserFlags::VERIFIED_DEVELOPER.bits(), 1 << 17);
121 const_assert_eq!(UserFlags::MODERATOR_PROGRAMS_ALUMNI.bits(), 1 << 18);
122 const_assert_eq!(UserFlags::CERTIFIED_MODERATOR.bits(), 1 << 18);
123 const_assert_eq!(UserFlags::BOT_HTTP_INTERACTIONS.bits(), 1 << 19);
124 const_assert_eq!(UserFlags::ACTIVE_DEVELOPER.bits(), 1 << 22);
125
126 #[test]
127 fn serde() {
128 serde_test::assert_tokens(
129 &UserFlags::PARTNER,
130 &[Token::U64(UserFlags::PARTNER.bits())],
131 );
132 serde_test::assert_de_tokens(&UserFlags::empty(), &[Token::U64(1 << 63)]);
134 }
135}