Skip to main content

twilight_model/application/monetization/
sku_type.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Clone, Copy, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]
4#[serde(from = "u8", into = "u8")]
5pub enum SkuType {
6    /// Durable one-time purchase.
7    Durable,
8    /// Consumable one-time purchase.
9    Consumable,
10    /// Represents a recurring subscription.
11    Subscription,
12    /// System-generated group for each [`Subscription`] SKU created.
13    ///
14    /// [`Subscription`]: super::Subscription
15    SubscriptionGroup,
16    Unknown(u8),
17}
18
19impl From<u8> for SkuType {
20    fn from(value: u8) -> Self {
21        match value {
22            2 => Self::Durable,
23            3 => Self::Consumable,
24            5 => SkuType::Subscription,
25            6 => SkuType::SubscriptionGroup,
26            other => SkuType::Unknown(other),
27        }
28    }
29}
30
31impl From<SkuType> for u8 {
32    fn from(value: SkuType) -> Self {
33        match value {
34            SkuType::Durable => 2,
35            SkuType::Consumable => 3,
36            SkuType::Subscription => 5,
37            SkuType::SubscriptionGroup => 6,
38            SkuType::Unknown(other) => other,
39        }
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::SkuType;
46    use serde_test::Token;
47    #[test]
48    fn sku_type() {
49        serde_test::assert_tokens(&SkuType::Durable, &[Token::U8(2)]);
50        serde_test::assert_tokens(&SkuType::Consumable, &[Token::U8(3)]);
51        serde_test::assert_tokens(&SkuType::Subscription, &[Token::U8(5)]);
52        serde_test::assert_tokens(&SkuType::SubscriptionGroup, &[Token::U8(6)]);
53        serde_test::assert_tokens(&SkuType::Unknown(u8::MAX), &[Token::U8(u8::MAX)]);
54    }
55}