twilight_model/guild/
partial_member.rs

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