twilight_model/guild/
partial_member.rs1use 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 #[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 #[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}