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