twilight_model/channel/
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 ChannelFlags: u64 {
10 const PINNED = 1 << 1;
12 const REQUIRE_TAG = 1 << 4;
14 const HIDE_MEDIA_DOWNLOAD_OPTIONS = 1 << 15;
16 }
17}
18
19impl<'de> Deserialize<'de> for ChannelFlags {
20 fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
21 Ok(Self::from_bits_truncate(u64::deserialize(deserializer)?))
22 }
23}
24
25impl Serialize for ChannelFlags {
26 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
27 where
28 S: Serializer,
29 {
30 serializer.serialize_u64(self.bits())
31 }
32}
33
34#[cfg(test)]
35mod tests {
36 use super::ChannelFlags;
37 use serde::{Deserialize, Serialize};
38 use serde_test::Token;
39 use static_assertions::{assert_impl_all, const_assert_eq};
40 use std::{
41 fmt::{Binary, Debug, LowerHex, Octal, UpperHex},
42 hash::Hash,
43 ops::{
44 BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign, Not, Sub, SubAssign,
45 },
46 };
47
48 assert_impl_all!(
49 ChannelFlags: Binary,
50 BitAnd,
51 BitAndAssign,
52 BitOr,
53 BitOrAssign,
54 BitXor,
55 BitXorAssign,
56 Clone,
57 Copy,
58 Debug,
59 Deserialize<'static>,
60 Eq,
61 Extend<ChannelFlags>,
62 FromIterator<ChannelFlags>,
63 Hash,
64 LowerHex,
65 Not,
66 Octal,
67 PartialEq,
68 Send,
69 Serialize,
70 Sub,
71 SubAssign,
72 Sync,
73 UpperHex
74 );
75 const_assert_eq!(ChannelFlags::PINNED.bits(), 1 << 1);
76 const_assert_eq!(ChannelFlags::REQUIRE_TAG.bits(), 1 << 4);
77
78 #[test]
79 fn serde() {
80 serde_test::assert_tokens(
81 &ChannelFlags::PINNED,
82 &[Token::U64(ChannelFlags::PINNED.bits())],
83 );
84 serde_test::assert_de_tokens(&ChannelFlags::empty(), &[Token::U64(1 << 63)]);
86 }
87}