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 AutoModeration,
21 Banner,
23 Community,
26 CreatorMonetizableProvisional,
28 CreatorStorePage,
30 DeveloperSupportServer,
32 Discoverable,
34 Featurable,
36 InvitesDisabled,
38 InviteSplash,
40 MemberVerificationGateEnabled,
42 MoreStickers,
44 News,
46 Partnered,
48 PreviewEnabled,
50 PrivateThreads,
52 RaidAlertsDisabled,
54 RoleIcons,
56 RoleSubscriptionsAvailableForPurchase,
58 RoleSubscriptionsEnabled,
60 TicketedEventsEnabled,
62 VanityUrl,
64 Verified,
66 VipRegions,
68 WelcomeScreenEnabled,
70 Unknown(String),
72}
73
74impl From<GuildFeature> for Cow<'static, str> {
75 fn from(value: GuildFeature) -> Self {
76 match value {
77 GuildFeature::AnimatedBanner => "ANIMATED_BANNER".into(),
78 GuildFeature::AnimatedIcon => "ANIMATED_ICON".into(),
79 GuildFeature::AutoModeration => "AUTO_MODERATION".into(),
80 GuildFeature::Banner => "BANNER".into(),
81 GuildFeature::Community => "COMMUNITY".into(),
82 GuildFeature::CreatorMonetizableProvisional => "CREATOR_MONETIZABLE_PROVISIONAL".into(),
83 GuildFeature::CreatorStorePage => "CREATOR_STORE_PAGE".into(),
84 GuildFeature::DeveloperSupportServer => "DEVELOPER_SUPPORT_SERVER".into(),
85 GuildFeature::Discoverable => "DISCOVERABLE".into(),
86 GuildFeature::Featurable => "FEATURABLE".into(),
87 GuildFeature::InvitesDisabled => "INVITES_DISABLED".into(),
88 GuildFeature::InviteSplash => "INVITE_SPLASH".into(),
89 GuildFeature::MemberVerificationGateEnabled => {
90 "MEMBER_VERIFICATION_GATE_ENABLED".into()
91 }
92 GuildFeature::MoreStickers => "MORE_STICKERS".into(),
93 GuildFeature::News => "NEWS".into(),
94 GuildFeature::Partnered => "PARTNERED".into(),
95 GuildFeature::PreviewEnabled => "PREVIEW_ENABLED".into(),
96 GuildFeature::PrivateThreads => "PRIVATE_THREADS".into(),
97 GuildFeature::RaidAlertsDisabled => "RAID_ALERTS_DISABLED".into(),
98 GuildFeature::RoleIcons => "ROLE_ICONS".into(),
99 GuildFeature::RoleSubscriptionsAvailableForPurchase => {
100 "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE".into()
101 }
102 GuildFeature::RoleSubscriptionsEnabled => "ROLE_SUBSCRIPTIONS_ENABLED".into(),
103 GuildFeature::TicketedEventsEnabled => "TICKETED_EVENTS_ENABLED".into(),
104 GuildFeature::VanityUrl => "VANITY_URL".into(),
105 GuildFeature::Verified => "VERIFIED".into(),
106 GuildFeature::VipRegions => "VIP_REGIONS".into(),
107 GuildFeature::WelcomeScreenEnabled => "WELCOME_SCREEN_ENABLED".into(),
108 GuildFeature::Unknown(unknown) => unknown.into(),
109 }
110 }
111}
112
113impl From<String> for GuildFeature {
114 fn from(value: String) -> Self {
115 match value.as_str() {
116 "ANIMATED_BANNER" => Self::AnimatedBanner,
117 "ANIMATED_ICON" => Self::AnimatedIcon,
118 "AUTO_MODERATION" => Self::AutoModeration,
119 "BANNER" => Self::Banner,
120 "COMMUNITY" => Self::Community,
121 "CREATOR_MONETIZABLE_PROVISIONAL" => GuildFeature::CreatorMonetizableProvisional,
122 "CREATOR_STORE_PAGE" => GuildFeature::CreatorStorePage,
123 "DEVELOPER_SUPPORT_SERVER" => Self::DeveloperSupportServer,
124 "DISCOVERABLE" => Self::Discoverable,
125 "FEATURABLE" => Self::Featurable,
126 "INVITES_DISABLED" => Self::InvitesDisabled,
127 "INVITE_SPLASH" => Self::InviteSplash,
128 "MEMBER_VERIFICATION_GATE_ENABLED" => Self::MemberVerificationGateEnabled,
129 "MORE_STICKERS" => Self::MoreStickers,
130 "NEWS" => Self::News,
131 "PARTNERED" => Self::Partnered,
132 "PREVIEW_ENABLED" => Self::PreviewEnabled,
133 "PRIVATE_THREADS" => Self::PrivateThreads,
134 "RAID_ALERTS_DISABLED" => Self::RaidAlertsDisabled,
135 "ROLE_ICONS" => Self::RoleIcons,
136 "ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE" => {
137 GuildFeature::RoleSubscriptionsAvailableForPurchase
138 }
139 "ROLE_SUBSCRIPTIONS_ENABLED" => GuildFeature::RoleSubscriptionsEnabled,
140 "TICKETED_EVENTS_ENABLED" => Self::TicketedEventsEnabled,
141 "VANITY_URL" => Self::VanityUrl,
142 "VERIFIED" => Self::Verified,
143 "VIP_REGIONS" => Self::VipRegions,
144 "WELCOME_SCREEN_ENABLED" => Self::WelcomeScreenEnabled,
145 _ => Self::Unknown(value),
146 }
147 }
148}
149
150#[cfg(test)]
151mod tests {
152 use super::GuildFeature;
153 use serde_test::Token;
154
155 #[test]
156 fn variants() {
157 serde_test::assert_tokens(
158 &GuildFeature::AnimatedBanner,
159 &[Token::Str("ANIMATED_BANNER")],
160 );
161 serde_test::assert_tokens(&GuildFeature::AnimatedIcon, &[Token::Str("ANIMATED_ICON")]);
162 serde_test::assert_tokens(
163 &GuildFeature::AutoModeration,
164 &[Token::Str("AUTO_MODERATION")],
165 );
166 serde_test::assert_tokens(&GuildFeature::Banner, &[Token::Str("BANNER")]);
167 serde_test::assert_tokens(&GuildFeature::Community, &[Token::Str("COMMUNITY")]);
168 serde_test::assert_tokens(
169 &GuildFeature::CreatorMonetizableProvisional,
170 &[Token::Str("CREATOR_MONETIZABLE_PROVISIONAL")],
171 );
172 serde_test::assert_tokens(
173 &GuildFeature::CreatorStorePage,
174 &[Token::Str("CREATOR_STORE_PAGE")],
175 );
176 serde_test::assert_tokens(
177 &GuildFeature::DeveloperSupportServer,
178 &[Token::Str("DEVELOPER_SUPPORT_SERVER")],
179 );
180 serde_test::assert_tokens(&GuildFeature::Discoverable, &[Token::Str("DISCOVERABLE")]);
181 serde_test::assert_tokens(&GuildFeature::Featurable, &[Token::Str("FEATURABLE")]);
182 serde_test::assert_tokens(
183 &GuildFeature::InvitesDisabled,
184 &[Token::Str("INVITES_DISABLED")],
185 );
186 serde_test::assert_tokens(&GuildFeature::InviteSplash, &[Token::Str("INVITE_SPLASH")]);
187 serde_test::assert_tokens(
188 &GuildFeature::MemberVerificationGateEnabled,
189 &[Token::Str("MEMBER_VERIFICATION_GATE_ENABLED")],
190 );
191 serde_test::assert_tokens(&GuildFeature::MoreStickers, &[Token::Str("MORE_STICKERS")]);
192 serde_test::assert_tokens(&GuildFeature::News, &[Token::Str("NEWS")]);
193 serde_test::assert_tokens(&GuildFeature::Partnered, &[Token::Str("PARTNERED")]);
194 serde_test::assert_tokens(
195 &GuildFeature::PreviewEnabled,
196 &[Token::Str("PREVIEW_ENABLED")],
197 );
198 serde_test::assert_tokens(
199 &GuildFeature::PrivateThreads,
200 &[Token::Str("PRIVATE_THREADS")],
201 );
202 serde_test::assert_tokens(&GuildFeature::RoleIcons, &[Token::Str("ROLE_ICONS")]);
203 serde_test::assert_tokens(
204 &GuildFeature::RoleSubscriptionsAvailableForPurchase,
205 &[Token::Str("ROLE_SUBSCRIPTIONS_AVAILABLE_FOR_PURCHASE")],
206 );
207 serde_test::assert_tokens(
208 &GuildFeature::RoleSubscriptionsEnabled,
209 &[Token::Str("ROLE_SUBSCRIPTIONS_ENABLED")],
210 );
211 serde_test::assert_tokens(
212 &GuildFeature::TicketedEventsEnabled,
213 &[Token::Str("TICKETED_EVENTS_ENABLED")],
214 );
215 serde_test::assert_tokens(&GuildFeature::VanityUrl, &[Token::Str("VANITY_URL")]);
216 serde_test::assert_tokens(&GuildFeature::Verified, &[Token::Str("VERIFIED")]);
217 serde_test::assert_tokens(&GuildFeature::VipRegions, &[Token::Str("VIP_REGIONS")]);
218 serde_test::assert_tokens(
219 &GuildFeature::WelcomeScreenEnabled,
220 &[Token::Str("WELCOME_SCREEN_ENABLED")],
221 );
222 serde_test::assert_tokens(
223 &GuildFeature::Unknown("UNKNOWN".to_owned()),
224 &[Token::Str("UNKNOWN")],
225 );
226 }
227}