twilight_model/guild/
integration_type.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 GuildIntegrationType {
15    /// Integration is a Discord application.
16    Discord,
17    /// Integration is a Twitch connection.
18    Twitch,
19    /// Integration is a YouTube connection.
20    YouTube,
21    /// Integration is a Guild Subscription.
22    GuildSubscription,
23    /// Variant value is unknown to the library.
24    Unknown(String),
25}
26
27impl From<GuildIntegrationType> for Cow<'static, str> {
28    fn from(value: GuildIntegrationType) -> Self {
29        match value {
30            GuildIntegrationType::Discord => "discord".into(),
31            GuildIntegrationType::Twitch => "twitch".into(),
32            GuildIntegrationType::YouTube => "youtube".into(),
33            GuildIntegrationType::GuildSubscription => "guild_subscription".into(),
34            GuildIntegrationType::Unknown(unknown) => unknown.into(),
35        }
36    }
37}
38
39impl From<String> for GuildIntegrationType {
40    fn from(value: String) -> Self {
41        match value.as_str() {
42            "discord" => Self::Discord,
43            "twitch" => Self::Twitch,
44            "youtube" => Self::YouTube,
45            "guild_subscription" => Self::GuildSubscription,
46            _ => Self::Unknown(value),
47        }
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::GuildIntegrationType;
54    use serde_test::Token;
55
56    #[test]
57    fn variants() {
58        const MAP: &[(GuildIntegrationType, &str)] = &[
59            (GuildIntegrationType::Discord, "discord"),
60            (GuildIntegrationType::Twitch, "twitch"),
61            (GuildIntegrationType::YouTube, "youtube"),
62            (
63                GuildIntegrationType::GuildSubscription,
64                "guild_subscription",
65            ),
66        ];
67
68        for (integration_type, value) in MAP {
69            serde_test::assert_tokens(integration_type, &[Token::Str(value)]);
70        }
71    }
72}