twilight_model/gateway/payload/incoming/
member_add.rs1use 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}