twilight_model/gateway/payload/incoming/
member_add.rs

1use crate::{
2    guild::Member,
3    id::{marker::GuildMarker, Id},
4};
5use serde::{Deserialize, Serialize};
6use std::ops::{Deref, DerefMut};
7
8#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
9pub struct MemberAdd {
10    pub guild_id: Id<GuildMarker>,
11    #[serde(flatten)]
12    pub member: Member,
13}
14
15impl Deref for MemberAdd {
16    type Target = Member;
17
18    fn deref(&self) -> &Self::Target {
19        &self.member
20    }
21}
22
23impl DerefMut for MemberAdd {
24    fn deref_mut(&mut self) -> &mut Self::Target {
25        &mut self.member
26    }
27}
28
29#[cfg(test)]
30mod tests {
31    use super::{Member, MemberAdd};
32    use crate::{
33        guild::MemberFlags,
34        id::{marker::GuildMarker, Id},
35        user::User,
36        util::Timestamp,
37    };
38    use serde_test::Token;
39
40    #[test]
41    fn member_add() {
42        let joined_at = Some(Timestamp::from_secs(1_632_072_645).expect("non zero"));
43        let flags = MemberFlags::BYPASSES_VERIFICATION | MemberFlags::DID_REJOIN;
44
45        let value = MemberAdd {
46            guild_id: Id::<GuildMarker>::new(1),
47            member: Member {
48                avatar: None,
49                communication_disabled_until: None,
50                deaf: false,
51                flags,
52                joined_at,
53                mute: false,
54                nick: None,
55                pending: true,
56                premium_since: None,
57                roles: vec![],
58                user: User {
59                    id: Id::new(2),
60                    accent_color: None,
61                    avatar: None,
62                    avatar_decoration: None,
63                    avatar_decoration_data: None,
64                    banner: None,
65                    bot: false,
66                    discriminator: 987,
67                    global_name: None,
68                    name: "ab".to_string(),
69                    mfa_enabled: None,
70                    locale: None,
71                    verified: None,
72                    email: None,
73                    flags: None,
74                    premium_type: None,
75                    system: None,
76                    public_flags: None,
77                },
78            },
79        };
80
81        serde_test::assert_tokens(
82            &value,
83            &[
84                Token::Map { len: None },
85                Token::Str("guild_id"),
86                Token::NewtypeStruct { name: "Id" },
87                Token::Str("1"),
88                Token::Str("communication_disabled_until"),
89                Token::None,
90                Token::Str("deaf"),
91                Token::Bool(false),
92                Token::Str("flags"),
93                Token::U64(flags.bits()),
94                Token::Str("joined_at"),
95                Token::Some,
96                Token::Str("2021-09-19T17:30:45.000000+00:00"),
97                Token::Str("mute"),
98                Token::Bool(false),
99                Token::Str("nick"),
100                Token::None,
101                Token::Str("pending"),
102                Token::Bool(true),
103                Token::Str("roles"),
104                Token::Seq { len: Some(0) },
105                Token::SeqEnd,
106                Token::Str("user"),
107                Token::Struct {
108                    name: "User",
109                    len: 9,
110                },
111                Token::Str("accent_color"),
112                Token::None,
113                Token::Str("avatar"),
114                Token::None,
115                Token::Str("avatar_decoration"),
116                Token::None,
117                Token::Str("avatar_decoration_data"),
118                Token::None,
119                Token::Str("banner"),
120                Token::None,
121                Token::Str("bot"),
122                Token::Bool(false),
123                Token::Str("discriminator"),
124                Token::Str("0987"),
125                Token::Str("id"),
126                Token::NewtypeStruct { name: "Id" },
127                Token::Str("2"),
128                Token::Str("username"),
129                Token::Str("ab"),
130                Token::StructEnd,
131                Token::MapEnd,
132            ],
133        );
134    }
135}