Skip to main content

twilight_model/application/monetization/
entitlement_type.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
4#[non_exhaustive]
5#[serde(from = "u8", into = "u8")]
6pub enum EntitlementType {
7    /// Entitlement was purchased by user.
8    Purchase,
9    /// Entitlement for Discord Nitro subscription.
10    PremiumSubscription,
11    /// Entitlement was gifted by developer.
12    DeveloperGift,
13    /// Entitlement was purchased by a dev in application test mode.
14    TestModePurchase,
15    /// Entitlement was granted when the SKU was free.
16    FreePurchase,
17    /// Entitlement was gifted by another user.
18    UserGift,
19    /// Entitlement was claimed by user for free as a Nitro Subscriber.
20    PremiumPurchase,
21    /// Entitlement was purchased as an app subscription.
22    ApplicationSubscription,
23    Unknown(u8),
24}
25
26impl From<u8> for EntitlementType {
27    fn from(value: u8) -> Self {
28        match value {
29            1 => Self::Purchase,
30            2 => Self::PremiumSubscription,
31            3 => Self::DeveloperGift,
32            4 => Self::TestModePurchase,
33            5 => Self::FreePurchase,
34            6 => Self::UserGift,
35            7 => Self::PremiumPurchase,
36            8 => Self::ApplicationSubscription,
37            other => Self::Unknown(other),
38        }
39    }
40}
41
42impl From<EntitlementType> for u8 {
43    fn from(value: EntitlementType) -> Self {
44        match value {
45            EntitlementType::Purchase => 1,
46            EntitlementType::PremiumSubscription => 2,
47            EntitlementType::DeveloperGift => 3,
48            EntitlementType::TestModePurchase => 4,
49            EntitlementType::FreePurchase => 5,
50            EntitlementType::UserGift => 6,
51            EntitlementType::PremiumPurchase => 7,
52            EntitlementType::ApplicationSubscription => 8,
53            EntitlementType::Unknown(other) => other,
54        }
55    }
56}
57
58impl EntitlementType {
59    pub const fn name(self) -> &'static str {
60        match self {
61            Self::Purchase => "Purchase",
62            Self::PremiumSubscription => "PremiumSubscription",
63            Self::DeveloperGift => "DeveloperGift",
64            Self::TestModePurchase => "TestModePurchase",
65            Self::FreePurchase => "FreePurchase",
66            Self::UserGift => "UserGift",
67            Self::PremiumPurchase => "PremiumPurchase",
68            Self::ApplicationSubscription => "ApplicationSubscription",
69            Self::Unknown(_) => "Unknown",
70        }
71    }
72}
73
74#[cfg(test)]
75mod tests {
76    use super::EntitlementType;
77    use serde_test::Token;
78
79    #[test]
80    fn variants() {
81        serde_test::assert_tokens(&EntitlementType::Purchase, &[Token::U8(1)]);
82        serde_test::assert_tokens(&EntitlementType::PremiumSubscription, &[Token::U8(2)]);
83        serde_test::assert_tokens(&EntitlementType::DeveloperGift, &[Token::U8(3)]);
84        serde_test::assert_tokens(&EntitlementType::TestModePurchase, &[Token::U8(4)]);
85        serde_test::assert_tokens(&EntitlementType::FreePurchase, &[Token::U8(5)]);
86        serde_test::assert_tokens(&EntitlementType::UserGift, &[Token::U8(6)]);
87        serde_test::assert_tokens(&EntitlementType::PremiumPurchase, &[Token::U8(7)]);
88        serde_test::assert_tokens(&EntitlementType::ApplicationSubscription, &[Token::U8(8)]);
89        serde_test::assert_tokens(&EntitlementType::Unknown(99), &[Token::U8(99)]);
90    }
91
92    #[test]
93    fn names() {
94        assert_eq!(EntitlementType::Purchase.name(), "Purchase");
95        assert_eq!(
96            EntitlementType::PremiumSubscription.name(),
97            "PremiumSubscription"
98        );
99        assert_eq!(EntitlementType::DeveloperGift.name(), "DeveloperGift");
100        assert_eq!(EntitlementType::TestModePurchase.name(), "TestModePurchase");
101        assert_eq!(EntitlementType::FreePurchase.name(), "FreePurchase");
102        assert_eq!(EntitlementType::UserGift.name(), "UserGift");
103        assert_eq!(EntitlementType::PremiumPurchase.name(), "PremiumPurchase");
104        assert_eq!(
105            EntitlementType::ApplicationSubscription.name(),
106            "ApplicationSubscription"
107        );
108        assert_eq!(EntitlementType::Unknown(99).name(), "Unknown");
109    }
110}