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