twilight_model/gateway/payload/incoming/
ready.rs

1use crate::{
2    gateway::ShardId, guild::UnavailableGuild, oauth::PartialApplication, user::CurrentUser,
3};
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
7pub struct Ready {
8    pub application: PartialApplication,
9    pub guilds: Vec<UnavailableGuild>,
10    pub resume_gateway_url: String,
11    pub session_id: String,
12    #[serde(skip_serializing_if = "Option::is_none")]
13    pub shard: Option<ShardId>,
14    pub user: CurrentUser,
15    #[serde(rename = "v")]
16    pub version: u64,
17}
18
19#[cfg(test)]
20mod tests {
21    use super::Ready;
22    use crate::{
23        gateway::ShardId,
24        guild::UnavailableGuild,
25        id::Id,
26        oauth::{ApplicationFlags, PartialApplication},
27        user::CurrentUser,
28    };
29    use serde_test::Token;
30
31    #[test]
32    #[allow(clippy::too_many_lines)]
33    fn ready() {
34        let guilds = vec![
35            UnavailableGuild {
36                id: Id::new(1),
37                unavailable: true,
38            },
39            UnavailableGuild {
40                id: Id::new(2),
41                unavailable: true,
42            },
43        ];
44
45        let ready = Ready {
46            application: PartialApplication {
47                flags: ApplicationFlags::empty(),
48                id: Id::new(100),
49            },
50            guilds,
51            resume_gateway_url: "wss://gateway.discord.gg".into(),
52            session_id: "foo".to_owned(),
53            shard: Some(ShardId::new(4, 7)),
54            user: CurrentUser {
55                accent_color: None,
56                avatar: None,
57                banner: None,
58                bot: false,
59                discriminator: 1212,
60                email: None,
61                flags: None,
62                id: Id::new(3),
63                locale: None,
64                mfa_enabled: false,
65                name: "bar".to_owned(),
66                premium_type: None,
67                public_flags: None,
68                verified: None,
69                global_name: None,
70            },
71            version: 8,
72        };
73
74        serde_test::assert_tokens(
75            &ready,
76            &[
77                Token::Struct {
78                    name: "Ready",
79                    len: 7,
80                },
81                Token::Str("application"),
82                Token::Struct {
83                    name: "PartialApplication",
84                    len: 2,
85                },
86                Token::Str("flags"),
87                Token::U64(0),
88                Token::Str("id"),
89                Token::NewtypeStruct { name: "Id" },
90                Token::Str("100"),
91                Token::StructEnd,
92                Token::Str("guilds"),
93                Token::Seq { len: Some(2) },
94                Token::Struct {
95                    name: "UnavailableGuild",
96                    len: 2,
97                },
98                Token::Str("id"),
99                Token::NewtypeStruct { name: "Id" },
100                Token::Str("1"),
101                Token::Str("unavailable"),
102                Token::Bool(true),
103                Token::StructEnd,
104                Token::Struct {
105                    name: "UnavailableGuild",
106                    len: 2,
107                },
108                Token::Str("id"),
109                Token::NewtypeStruct { name: "Id" },
110                Token::Str("2"),
111                Token::Str("unavailable"),
112                Token::Bool(true),
113                Token::StructEnd,
114                Token::SeqEnd,
115                Token::Str("resume_gateway_url"),
116                Token::Str("wss://gateway.discord.gg"),
117                Token::Str("session_id"),
118                Token::Str("foo"),
119                Token::Str("shard"),
120                Token::Some,
121                Token::Tuple { len: 2 },
122                Token::U32(4),
123                Token::U32(7),
124                Token::TupleEnd,
125                Token::Str("user"),
126                Token::Struct {
127                    name: "CurrentUser",
128                    len: 8,
129                },
130                Token::Str("accent_color"),
131                Token::None,
132                Token::Str("avatar"),
133                Token::None,
134                Token::Str("banner"),
135                Token::None,
136                Token::Str("bot"),
137                Token::Bool(false),
138                Token::Str("discriminator"),
139                Token::Str("1212"),
140                Token::Str("id"),
141                Token::NewtypeStruct { name: "Id" },
142                Token::Str("3"),
143                Token::Str("mfa_enabled"),
144                Token::Bool(false),
145                Token::Str("username"),
146                Token::Str("bar"),
147                Token::StructEnd,
148                Token::Str("v"),
149                Token::U64(8),
150                Token::StructEnd,
151            ],
152        );
153    }
154}