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