1#![allow(deprecated)]
2use std::borrow::Cow;
3
4use serde::{Deserialize, Serialize};
5
6#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
12#[non_exhaustive]
13#[serde(from = "String", into = "Cow<'static, str>")]
14pub enum GuildFeature {
15 AnimatedBanner,
17 AnimatedIcon,
19 ApplicationCommandPermissionsV2,
21 AutoModeration,
23 Banner,
25 Community,
28 CreatorMonetizableProvisional,
30 CreatorStorePage,
32 DeveloperSupportServer,
34 Discoverable,
36 EnhancedRoleColors,
38 Featurable,
40 GuestsEnabled,
42 GuildTags,
44 InvitesDisabled,
46 InviteSplash,
48 MemberVerificationGateEnabled,
50 MoreSoundboard,
52 MoreStickers,
54 News,
56 Partnered,
58 PreviewEnabled,
60 PrivateThreads,
62 PruneRequiresAdmin,
74 RaidAlertsDisabled,
76 RoleIcons,
78 RoleSubscriptionsAvailableForPurchase,
80 RoleSubscriptionsEnabled,
82 Soundboard,
84 TicketedEventsEnabled,
86 VanityUrl,
88 Verified,
90 VipRegions,
92 WelcomeScreenEnabled,
94 Unknown(String),
96}
97
98impl From<GuildFeature> for Cow<'static, str> {
99 fn from(value: GuildFeature) -> Self {
100 match value {
101 GuildFeature::AnimatedBanner => "ANIMATED_BANNER".into(),
102 GuildFeature::AnimatedIcon => "ANIMATED_ICON".into(),
103 GuildFeature::ApplicationCommandPermissionsV2 => {
104 "APPLICATION_COMMAND_PERMISSIONS_V2".into()
105 }
106 GuildFeature::AutoModeration => "AUTO_MODERATION".into(),
107 GuildFeature::Banner => "BANNER".into(),
108 GuildFeature::Community => "COMMUNITY".into(),
109 GuildFeature::CreatorMonetizableProvisional => "CREATOR_MONETIZABLE_PROVISIONAL".into(),
110 GuildFeature::CreatorStorePage => "CREATOR_STORE_PAGE".into(),
111 GuildFeature::DeveloperSupportServer => "DEVELOPER_SUPPORT_SERVER".into(),
112 GuildFeature::Discoverable => "DISCOVERABLE".into(),
113 GuildFeature::EnhancedRoleColors => "ENHANCED_ROLE_COLORS".into(),
114 GuildFeature::Featurable => "FEATURABLE".into(),
115 GuildFeature::GuestsEnabled => "GUESTS_ENABLED".into(),
116 GuildFeature::GuildTags => "GUILD_TAGS".into(),
117 GuildFeature::InvitesDisabled => "INVITES_DISABLED".into(),
118 GuildFeature::InviteSplash => "INVITE_SPLASH".into(),
119 GuildFeature::MemberVerificationGateEnabled => {
120 "MEMBER_VERIFICATION_GATE_ENABLED".into()
121 }
122 GuildFeature::MoreSoundboard => "MORE_SOUNDBOARD".into(),
123 GuildFeature::MoreStickers => "MORE_STICKERS".into(),
124 GuildFeature::News => "NEWS".into(),
125 GuildFeature::Partnered => "PARTNERED".into(),
126 GuildFeature::PreviewEnabled => "PREVIEW_ENABLED".into(),
127 GuildFeature::PrivateThreads => "PRIVATE_THREADS".into(),
128 GuildFeature::PruneRequiresAdmin => "PRUNE_REQUIRES_ADMIN".into(),
129 GuildFeature::RaidAlertsDisabled => "RAID_ALERTS_DISABLED".into(),
130 GuildFeature::RoleIcons => "ROLE_ICONS".into(),
131 GuildFeature::RoleSubscriptionsAvailableForPurchase => {
132 "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE".into()
133 }
134 GuildFeature::RoleSubscriptionsEnabled => "ROLE_SUBSCRIPTIONS_ENABLED".into(),
135 GuildFeature::Soundboard => "SOUNDBOARD".into(),
136 GuildFeature::TicketedEventsEnabled => "TICKETED_EVENTS_ENABLED".into(),
137 GuildFeature::VanityUrl => "VANITY_URL".into(),
138 GuildFeature::Verified => "VERIFIED".into(),
139 GuildFeature::VipRegions => "VIP_REGIONS".into(),
140 GuildFeature::WelcomeScreenEnabled => "WELCOME_SCREEN_ENABLED".into(),
141 GuildFeature::Unknown(unknown) => unknown.into(),
142 }
143 }
144}
145
146impl From<String> for GuildFeature {
147 fn from(value: String) -> Self {
148 match value.as_str() {
149 "ANIMATED_BANNER" => Self::AnimatedBanner,
150 "ANIMATED_ICON" => Self::AnimatedIcon,
151 "APPLICATION_COMMAND_PERMISSIONS_V2" => Self::ApplicationCommandPermissionsV2,
152 "AUTO_MODERATION" => Self::AutoModeration,
153 "BANNER" => Self::Banner,
154 "COMMUNITY" => Self::Community,
155 "CREATOR_MONETIZABLE_PROVISIONAL" => GuildFeature::CreatorMonetizableProvisional,
156 "CREATOR_STORE_PAGE" => GuildFeature::CreatorStorePage,
157 "DEVELOPER_SUPPORT_SERVER" => Self::DeveloperSupportServer,
158 "DISCOVERABLE" => Self::Discoverable,
159 "ENHANCED_ROLE_COLORS" => Self::EnhancedRoleColors,
160 "FEATURABLE" => Self::Featurable,
161 "GUESTS_ENABLED" => Self::GuestsEnabled,
162 "GUILD_TAGS" => Self::GuildTags,
163 "INVITES_DISABLED" => Self::InvitesDisabled,
164 "INVITE_SPLASH" => Self::InviteSplash,
165 "MEMBER_VERIFICATION_GATE_ENABLED" => Self::MemberVerificationGateEnabled,
166 "MORE_SOUNDBOARD" => Self::MoreSoundboard,
167 "MORE_STICKERS" => Self::MoreStickers,
168 "NEWS" => Self::News,
169 "PARTNERED" => Self::Partnered,
170 "PREVIEW_ENABLED" => Self::PreviewEnabled,
171 "PRIVATE_THREADS" => Self::PrivateThreads,
172 "PRUNE_REQUIRES_ADMIN" => Self::PruneRequiresAdmin,
173 "RAID_ALERTS_DISABLED" => Self::RaidAlertsDisabled,
174 "ROLE_ICONS" => Self::RoleIcons,
175 "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE" => {
176 GuildFeature::RoleSubscriptionsAvailableForPurchase
177 }
178 "ROLE_SUBSCRIPTIONS_ENABLED" => GuildFeature::RoleSubscriptionsEnabled,
179 "SOUNDBOARD" => Self::Soundboard,
180 "TICKETED_EVENTS_ENABLED" => Self::TicketedEventsEnabled,
181 "VANITY_URL" => Self::VanityUrl,
182 "VERIFIED" => Self::Verified,
183 "VIP_REGIONS" => Self::VipRegions,
184 "WELCOME_SCREEN_ENABLED" => Self::WelcomeScreenEnabled,
185 _ => Self::Unknown(value),
186 }
187 }
188}
189
190#[cfg(test)]
191mod tests {
192 use super::GuildFeature;
193 use serde_test::Token;
194
195 #[test]
196 fn variants() {
197 serde_test::assert_tokens(
198 &GuildFeature::AnimatedBanner,
199 &[Token::Str("ANIMATED_BANNER")],
200 );
201 serde_test::assert_tokens(&GuildFeature::AnimatedIcon, &[Token::Str("ANIMATED_ICON")]);
202 serde_test::assert_tokens(
203 &GuildFeature::ApplicationCommandPermissionsV2,
204 &[Token::Str("APPLICATION_COMMAND_PERMISSIONS_V2")],
205 );
206 serde_test::assert_tokens(
207 &GuildFeature::AutoModeration,
208 &[Token::Str("AUTO_MODERATION")],
209 );
210 serde_test::assert_tokens(&GuildFeature::Banner, &[Token::Str("BANNER")]);
211 serde_test::assert_tokens(&GuildFeature::Community, &[Token::Str("COMMUNITY")]);
212 serde_test::assert_tokens(
213 &GuildFeature::CreatorMonetizableProvisional,
214 &[Token::Str("CREATOR_MONETIZABLE_PROVISIONAL")],
215 );
216 serde_test::assert_tokens(
217 &GuildFeature::CreatorStorePage,
218 &[Token::Str("CREATOR_STORE_PAGE")],
219 );
220 serde_test::assert_tokens(
221 &GuildFeature::DeveloperSupportServer,
222 &[Token::Str("DEVELOPER_SUPPORT_SERVER")],
223 );
224 serde_test::assert_tokens(&GuildFeature::Discoverable, &[Token::Str("DISCOVERABLE")]);
225 serde_test::assert_tokens(
226 &GuildFeature::EnhancedRoleColors,
227 &[Token::Str("ENHANCED_ROLE_COLORS")],
228 );
229 serde_test::assert_tokens(&GuildFeature::Featurable, &[Token::Str("FEATURABLE")]);
230 serde_test::assert_tokens(
231 &GuildFeature::GuestsEnabled,
232 &[Token::Str("GUESTS_ENABLED")],
233 );
234 serde_test::assert_tokens(&GuildFeature::GuildTags, &[Token::Str("GUILD_TAGS")]);
235 serde_test::assert_tokens(
236 &GuildFeature::InvitesDisabled,
237 &[Token::Str("INVITES_DISABLED")],
238 );
239 serde_test::assert_tokens(&GuildFeature::InviteSplash, &[Token::Str("INVITE_SPLASH")]);
240 serde_test::assert_tokens(
241 &GuildFeature::MemberVerificationGateEnabled,
242 &[Token::Str("MEMBER_VERIFICATION_GATE_ENABLED")],
243 );
244 serde_test::assert_tokens(
245 &GuildFeature::MoreSoundboard,
246 &[Token::Str("MORE_SOUNDBOARD")],
247 );
248 serde_test::assert_tokens(&GuildFeature::MoreStickers, &[Token::Str("MORE_STICKERS")]);
249 serde_test::assert_tokens(&GuildFeature::News, &[Token::Str("NEWS")]);
250 serde_test::assert_tokens(&GuildFeature::Partnered, &[Token::Str("PARTNERED")]);
251 serde_test::assert_tokens(
252 &GuildFeature::PreviewEnabled,
253 &[Token::Str("PREVIEW_ENABLED")],
254 );
255 serde_test::assert_tokens(
256 &GuildFeature::PrivateThreads,
257 &[Token::Str("PRIVATE_THREADS")],
258 );
259 serde_test::assert_tokens(
260 &GuildFeature::PruneRequiresAdmin,
261 &[Token::Str("PRUNE_REQUIRES_ADMIN")],
262 );
263 serde_test::assert_tokens(&GuildFeature::RoleIcons, &[Token::Str("ROLE_ICONS")]);
264 serde_test::assert_tokens(
265 &GuildFeature::RoleSubscriptionsAvailableForPurchase,
266 &[Token::Str("ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE")],
267 );
268 serde_test::assert_tokens(
269 &GuildFeature::RoleSubscriptionsEnabled,
270 &[Token::Str("ROLE_SUBSCRIPTIONS_ENABLED")],
271 );
272 serde_test::assert_tokens(&GuildFeature::Soundboard, &[Token::Str("SOUNDBOARD")]);
273 serde_test::assert_tokens(
274 &GuildFeature::TicketedEventsEnabled,
275 &[Token::Str("TICKETED_EVENTS_ENABLED")],
276 );
277 serde_test::assert_tokens(&GuildFeature::VanityUrl, &[Token::Str("VANITY_URL")]);
278 serde_test::assert_tokens(&GuildFeature::Verified, &[Token::Str("VERIFIED")]);
279 serde_test::assert_tokens(&GuildFeature::VipRegions, &[Token::Str("VIP_REGIONS")]);
280 serde_test::assert_tokens(
281 &GuildFeature::WelcomeScreenEnabled,
282 &[Token::Str("WELCOME_SCREEN_ENABLED")],
283 );
284 serde_test::assert_tokens(
285 &GuildFeature::Unknown("UNKNOWN".to_owned()),
286 &[Token::Str("UNKNOWN")],
287 );
288 }
289}