1use super::{
2 AfkTimeout, DefaultMessageNotificationLevel, Emoji, ExplicitContentFilter, GuildFeature,
3 MfaLevel, NSFWLevel, Permissions, PremiumTier, Role, SystemChannelFlags, VerificationLevel,
4};
5use crate::{
6 id::{
7 marker::{ApplicationMarker, ChannelMarker, GuildMarker, UserMarker},
8 Id,
9 },
10 util::image_hash::ImageHash,
11};
12use serde::{Deserialize, Serialize};
13
14#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
15pub struct PartialGuild {
16 pub afk_channel_id: Option<Id<ChannelMarker>>,
17 pub afk_timeout: AfkTimeout,
18 pub application_id: Option<Id<ApplicationMarker>>,
19 pub banner: Option<ImageHash>,
20 pub default_message_notifications: DefaultMessageNotificationLevel,
21 pub description: Option<String>,
22 pub discovery_splash: Option<ImageHash>,
23 pub emojis: Vec<Emoji>,
24 pub explicit_content_filter: ExplicitContentFilter,
25 pub features: Vec<GuildFeature>,
26 pub icon: Option<ImageHash>,
27 pub id: Id<GuildMarker>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub max_members: Option<u64>,
30 #[serde(skip_serializing_if = "Option::is_none")]
31 pub max_presences: Option<u64>,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub member_count: Option<u64>,
34 pub mfa_level: MfaLevel,
35 pub name: String,
36 pub nsfw_level: NSFWLevel,
37 pub owner_id: Id<UserMarker>,
38 #[serde(skip_serializing_if = "Option::is_none")]
39 pub owner: Option<bool>,
40 #[serde(skip_serializing_if = "Option::is_none")]
41 pub permissions: Option<Permissions>,
42 pub preferred_locale: String,
43 pub premium_progress_bar_enabled: bool,
45 #[serde(skip_serializing_if = "Option::is_none")]
46 pub premium_subscription_count: Option<u64>,
47 pub premium_tier: PremiumTier,
48 pub public_updates_channel_id: Option<Id<ChannelMarker>>,
51 pub roles: Vec<Role>,
52 pub rules_channel_id: Option<Id<ChannelMarker>>,
53 pub splash: Option<ImageHash>,
54 pub system_channel_flags: SystemChannelFlags,
55 pub system_channel_id: Option<Id<ChannelMarker>>,
56 pub verification_level: VerificationLevel,
57 pub vanity_url_code: Option<String>,
58 #[serde(skip_serializing_if = "Option::is_none")]
59 pub widget_channel_id: Option<Id<ChannelMarker>>,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub widget_enabled: Option<bool>,
62}
63
64#[cfg(test)]
65mod tests {
66 use crate::{
67 guild::{AfkTimeout, GuildFeature},
68 test::image_hash,
69 };
70
71 use super::{
72 DefaultMessageNotificationLevel, ExplicitContentFilter, MfaLevel, NSFWLevel, PartialGuild,
73 Permissions, PremiumTier, SystemChannelFlags, VerificationLevel,
74 };
75 use crate::id::Id;
76 use serde_test::Token;
77
78 #[allow(clippy::too_many_lines)]
79 #[test]
80 fn partial_guild() {
81 let value = PartialGuild {
82 afk_channel_id: Some(Id::new(2)),
83 afk_timeout: AfkTimeout::FIFTEEN_MINUTES,
84 application_id: Some(Id::new(3)),
85 banner: Some(image_hash::BANNER),
86 default_message_notifications: DefaultMessageNotificationLevel::Mentions,
87 description: Some("a description".to_owned()),
88 discovery_splash: Some(image_hash::SPLASH),
89 emojis: Vec::new(),
90 explicit_content_filter: ExplicitContentFilter::MembersWithoutRole,
91 features: Vec::from([GuildFeature::AnimatedBanner]),
92 icon: Some(image_hash::ICON),
93 id: Id::new(1),
94 max_members: Some(25_000),
95 max_presences: Some(10_000),
96 member_count: Some(12_000),
97 mfa_level: MfaLevel::Elevated,
98 name: "the name".to_owned(),
99 nsfw_level: NSFWLevel::Default,
100 owner_id: Id::new(5),
101 owner: Some(false),
102 permissions: Some(Permissions::SEND_MESSAGES),
103 preferred_locale: "en-us".to_owned(),
104 premium_progress_bar_enabled: true,
105 premium_subscription_count: Some(3),
106 premium_tier: PremiumTier::Tier1,
107 public_updates_channel_id: None,
108 roles: Vec::new(),
109 rules_channel_id: Some(Id::new(6)),
110 splash: Some(image_hash::SPLASH),
111 system_channel_flags: SystemChannelFlags::SUPPRESS_PREMIUM_SUBSCRIPTIONS,
112 system_channel_id: Some(Id::new(7)),
113 verification_level: VerificationLevel::Medium,
114 vanity_url_code: Some("twilight".to_owned()),
115 widget_channel_id: Some(Id::new(8)),
116 widget_enabled: Some(true),
117 };
118
119 serde_test::assert_tokens(
120 &value,
121 &[
122 Token::Struct {
123 name: "PartialGuild",
124 len: 35,
125 },
126 Token::Str("afk_channel_id"),
127 Token::Some,
128 Token::NewtypeStruct { name: "Id" },
129 Token::Str("2"),
130 Token::Str("afk_timeout"),
131 Token::NewtypeStruct { name: "AfkTimeout" },
132 Token::U16(900),
133 Token::Str("application_id"),
134 Token::Some,
135 Token::NewtypeStruct { name: "Id" },
136 Token::Str("3"),
137 Token::Str("banner"),
138 Token::Some,
139 Token::Str(image_hash::BANNER_INPUT),
140 Token::Str("default_message_notifications"),
141 Token::U8(1),
142 Token::Str("description"),
143 Token::Some,
144 Token::Str("a description"),
145 Token::Str("discovery_splash"),
146 Token::Some,
147 Token::Str(image_hash::SPLASH_INPUT),
148 Token::Str("emojis"),
149 Token::Seq { len: Some(0) },
150 Token::SeqEnd,
151 Token::Str("explicit_content_filter"),
152 Token::U8(1),
153 Token::Str("features"),
154 Token::Seq { len: Some(1) },
155 Token::Str("ANIMATED_BANNER"),
156 Token::SeqEnd,
157 Token::Str("icon"),
158 Token::Some,
159 Token::Str(image_hash::ICON_INPUT),
160 Token::Str("id"),
161 Token::NewtypeStruct { name: "Id" },
162 Token::Str("1"),
163 Token::Str("max_members"),
164 Token::Some,
165 Token::U64(25_000),
166 Token::Str("max_presences"),
167 Token::Some,
168 Token::U64(10_000),
169 Token::Str("member_count"),
170 Token::Some,
171 Token::U64(12_000),
172 Token::Str("mfa_level"),
173 Token::U8(1),
174 Token::Str("name"),
175 Token::Str("the name"),
176 Token::Str("nsfw_level"),
177 Token::U8(0),
178 Token::Str("owner_id"),
179 Token::NewtypeStruct { name: "Id" },
180 Token::Str("5"),
181 Token::Str("owner"),
182 Token::Some,
183 Token::Bool(false),
184 Token::Str("permissions"),
185 Token::Some,
186 Token::Str("2048"),
187 Token::Str("preferred_locale"),
188 Token::Str("en-us"),
189 Token::Str("premium_progress_bar_enabled"),
190 Token::Bool(true),
191 Token::Str("premium_subscription_count"),
192 Token::Some,
193 Token::U64(3),
194 Token::Str("premium_tier"),
195 Token::U8(1),
196 Token::Str("public_updates_channel_id"),
197 Token::None,
198 Token::Str("roles"),
199 Token::Seq { len: Some(0) },
200 Token::SeqEnd,
201 Token::Str("rules_channel_id"),
202 Token::Some,
203 Token::NewtypeStruct { name: "Id" },
204 Token::Str("6"),
205 Token::Str("splash"),
206 Token::Some,
207 Token::Str(image_hash::SPLASH_INPUT),
208 Token::Str("system_channel_flags"),
209 Token::U64(2),
210 Token::Str("system_channel_id"),
211 Token::Some,
212 Token::NewtypeStruct { name: "Id" },
213 Token::Str("7"),
214 Token::Str("verification_level"),
215 Token::U8(2),
216 Token::Str("vanity_url_code"),
217 Token::Some,
218 Token::Str("twilight"),
219 Token::Str("widget_channel_id"),
220 Token::Some,
221 Token::NewtypeStruct { name: "Id" },
222 Token::Str("8"),
223 Token::Str("widget_enabled"),
224 Token::Some,
225 Token::Bool(true),
226 Token::StructEnd,
227 ],
228 );
229 }
230}