twilight_model/guild/
feature.rs

1#![allow(deprecated)]
2use std::borrow::Cow;
3
4use serde::{Deserialize, Serialize};
5
6/// Special and optional guild features.
7///
8/// See [Discord Docs/Guild Features].
9///
10/// [Discord Docs/Guild Features]: https://discord.com/developers/docs/resources/guild#guild-object-guild-features
11#[derive(Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
12#[non_exhaustive]
13#[serde(from = "String", into = "Cow<'static, str>")]
14pub enum GuildFeature {
15    /// Has access to set an animated guild banner image.
16    AnimatedBanner,
17    /// Has access to set an animated guild icon.
18    AnimatedIcon,
19    /// Has set up auto moderation rules.
20    AutoModeration,
21    /// Has access to set a guild banner image.
22    Banner,
23    /// Can enable welcome screen, membership screening, stage channels,
24    /// discovery, and receives community updates.
25    Community,
26    /// Guild has enabled monetization.
27    CreatorMonetizableProvisional,
28    /// Guild has enabled the role subscription promotional page.
29    CreatorStorePage,
30    /// Guild has been set as a support server on the App Directory.
31    DeveloperSupportServer,
32    /// Is able to be discovered in the directory.
33    Discoverable,
34    /// Is able to be featured in the directory.
35    Featurable,
36    /// Invites have been paused, this prevents new users from joining.
37    InvitesDisabled,
38    /// Has access to set an invite splash background.
39    InviteSplash,
40    /// Has enabled membership screening.
41    MemberVerificationGateEnabled,
42    /// Has increased custom sticker slots.
43    MoreStickers,
44    /// Has access to create news channels.
45    News,
46    /// Is partnered.
47    Partnered,
48    /// Can be previewed before joining via membership screening or the directory.
49    PreviewEnabled,
50    /// Has access to create private threads.
51    PrivateThreads,
52    /// Guild has disabled alerts for join raids in the configured safety alerts channel.
53    RaidAlertsDisabled,
54    /// Is able to set role icons.
55    RoleIcons,
56    /// Guild has role subscriptions that can be purchased.
57    RoleSubscriptionsAvailableForPurchase,
58    /// Guild has enabled role subscriptions.
59    RoleSubscriptionsEnabled,
60    /// Has enabled ticketed events.
61    TicketedEventsEnabled,
62    /// Has access to set a vanity URL.
63    VanityUrl,
64    /// Is verified.
65    Verified,
66    /// Has access to set 384kps bitrate in voice (previously VIP voice servers).
67    VipRegions,
68    /// Has enabled the welcome screen.
69    WelcomeScreenEnabled,
70    /// Variant value is unknown to the library.
71    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}