twilight_model/guild/
partial_member.rs

1use super::MemberFlags;
2use crate::user::AvatarDecorationData;
3use crate::{
4    guild::Permissions,
5    id::{Id, marker::RoleMarker},
6    user::User,
7    util::{ImageHash, Timestamp},
8};
9use serde::{Deserialize, Serialize};
10
11#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
12pub struct PartialMember {
13    /// Member's guild avatar.
14    #[serde(skip_serializing_if = "Option::is_none")]
15    pub avatar: Option<ImageHash>,
16    #[serde(skip_serializing_if = "Option::is_none")]
17    pub avatar_decoration_data: Option<AvatarDecorationData>,
18    #[serde(skip_serializing_if = "Option::is_none")]
19    pub banner: Option<ImageHash>,
20    pub communication_disabled_until: Option<Timestamp>,
21    pub deaf: bool,
22    pub flags: MemberFlags,
23    pub joined_at: Option<Timestamp>,
24    pub mute: bool,
25    pub nick: Option<String>,
26    /// Permission data for the member.
27    ///
28    /// Sent in an [`Interaction`].
29    ///
30    /// [`Interaction`]: crate::application::interaction::Interaction
31    #[serde(skip_serializing_if = "Option::is_none")]
32    pub permissions: Option<Permissions>,
33    #[serde(skip_serializing_if = "Option::is_none")]
34    pub premium_since: Option<Timestamp>,
35    pub roles: Vec<Id<RoleMarker>>,
36    pub user: Option<User>,
37}
38
39#[cfg(test)]
40mod tests {
41    use super::PartialMember;
42    use crate::{
43        guild::MemberFlags,
44        id::Id,
45        util::datetime::{Timestamp, TimestampParseError},
46    };
47    use serde_test::Token;
48    use std::str::FromStr;
49
50    #[test]
51    fn partial_member() -> Result<(), TimestampParseError> {
52        let joined_at = Some(Timestamp::from_str("2015-04-26T06:26:56.936000+00:00")?);
53        let flags = MemberFlags::BYPASSES_VERIFICATION | MemberFlags::DID_REJOIN;
54
55        let value = PartialMember {
56            avatar: None,
57            avatar_decoration_data: None,
58            banner: None,
59            communication_disabled_until: None,
60            deaf: false,
61            flags,
62            joined_at,
63            mute: true,
64            nick: Some("a nickname".to_owned()),
65            permissions: None,
66            premium_since: None,
67            roles: vec![Id::new(1)],
68            user: None,
69        };
70
71        serde_test::assert_tokens(
72            &value,
73            &[
74                Token::Struct {
75                    name: "PartialMember",
76                    len: 8,
77                },
78                Token::Str("communication_disabled_until"),
79                Token::None,
80                Token::Str("deaf"),
81                Token::Bool(false),
82                Token::Str("flags"),
83                Token::U64(flags.bits()),
84                Token::Str("joined_at"),
85                Token::Some,
86                Token::Str("2015-04-26T06:26:56.936000+00:00"),
87                Token::Str("mute"),
88                Token::Bool(true),
89                Token::Str("nick"),
90                Token::Some,
91                Token::Str("a nickname"),
92                Token::Str("roles"),
93                Token::Seq { len: Some(1) },
94                Token::NewtypeStruct { name: "Id" },
95                Token::Str("1"),
96                Token::SeqEnd,
97                Token::Str("user"),
98                Token::None,
99                Token::StructEnd,
100            ],
101        );
102
103        Ok(())
104    }
105}