twilight_model/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 ChannelFlags: u64 {
10        /// Channel is pinned in a forum.
11        const PINNED = 1 << 1;
12        /// New threads in a forum channel require a tag.
13        const REQUIRE_TAG = 1 << 4;
14        /// Hide the download options for this post in a media channel.
15        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        // Deserialization truncates unknown bits.
85        serde_test::assert_de_tokens(&ChannelFlags::empty(), &[Token::U64(1 << 63)]);
86    }
87}