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 const MODERATOR_PROGRAMS_ALUMNI = 1 << 18;
36 const BOT_HTTP_INTERACTIONS = 1 << 19;
39 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 serde_test::assert_de_tokens(&UserFlags::empty(), &[Token::U64(1 << 63)]);
129 }
130}