twilight_model/gateway/payload/incoming/
member_add.rs

1use crate::{
2    guild::Member,
3    id::{Id, marker::GuildMarker},
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::{Id, marker::GuildMarker},
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                avatar_decoration_data: None,
50                banner: None,
51                communication_disabled_until: None,
52                deaf: false,
53                flags,
54                joined_at,
55                mute: false,
56                nick: None,
57                pending: true,
58                premium_since: None,
59                roles: vec![],
60                user: User {
61                    id: Id::new(2),
62                    accent_color: None,
63                    avatar: None,
64                    avatar_decoration: None,
65                    avatar_decoration_data: None,
66                    banner: None,
67                    bot: false,
68                    discriminator: 987,
69                    global_name: None,
70                    name: "ab".to_string(),
71                    mfa_enabled: None,
72                    locale: None,
73                    verified: None,
74                    email: None,
75                    flags: None,
76                    premium_type: None,
77                    primary_guild: None,
78                    public_flags: None,
79                    system: None,
80                },
81            },
82        };
83
84        serde_test::assert_tokens(
85            &value,
86            &[
87                Token::Map { len: None },
88                Token::Str("guild_id"),
89                Token::NewtypeStruct { name: "Id" },
90                Token::Str("1"),
91                Token::Str("communication_disabled_until"),
92                Token::None,
93                Token::Str("deaf"),
94                Token::Bool(false),
95                Token::Str("flags"),
96                Token::U64(flags.bits()),
97                Token::Str("joined_at"),
98                Token::Some,
99                Token::Str("2021-09-19T17:30:45.000000+00:00"),
100                Token::Str("mute"),
101                Token::Bool(false),
102                Token::Str("nick"),
103                Token::None,
104                Token::Str("pending"),
105                Token::Bool(true),
106                Token::Str("roles"),
107                Token::Seq { len: Some(0) },
108                Token::SeqEnd,
109                Token::Str("user"),
110                Token::Struct {
111                    name: "User",
112                    len: 9,
113                },
114                Token::Str("accent_color"),
115                Token::None,
116                Token::Str("avatar"),
117                Token::None,
118                Token::Str("avatar_decoration"),
119                Token::None,
120                Token::Str("avatar_decoration_data"),
121                Token::None,
122                Token::Str("banner"),
123                Token::None,
124                Token::Str("bot"),
125                Token::Bool(false),
126                Token::Str("discriminator"),
127                Token::Str("0987"),
128                Token::Str("id"),
129                Token::NewtypeStruct { name: "Id" },
130                Token::Str("2"),
131                Token::Str("username"),
132                Token::Str("ab"),
133                Token::StructEnd,
134                Token::MapEnd,
135            ],
136        );
137    }
138}