twilight_model/application/monetization/
sku.rs

1use serde::{Deserialize, Serialize};
2
3use crate::id::{
4    marker::{ApplicationMarker, SkuMarker},
5    Id,
6};
7
8use super::{SkuFlags, SkuType};
9
10/// SKUs (stock-keeping units) in Discord represent premium offerings that can be made available to your application's users or guilds.
11#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
12pub struct Sku {
13    /// ID of the parent application.
14    application_id: Id<ApplicationMarker>,
15    /// Flags for the SKU.
16    flags: SkuFlags,
17    /// ID of SKU.
18    id: Id<SkuMarker>,
19    /// Type of SKU.
20    #[serde(rename = "type")]
21    kind: SkuType,
22    /// Customer-facing name of your premium offering.
23    name: String,
24    /// System-generated URL slug based on the SKU's name.
25    slug: String,
26}
27
28#[cfg(test)]
29mod tests {
30    use serde_test::Token;
31
32    use crate::{
33        application::monetization::{SkuFlags, SkuType},
34        id::Id,
35    };
36
37    use super::Sku;
38
39    #[test]
40    fn sku() {
41        let value = Sku {
42            application_id: Id::new(1),
43            flags: SkuFlags::GUILD_SUBSCRIPTION,
44            id: Id::new(2),
45            kind: SkuType::Subscription,
46            name: "a name".to_owned(),
47            slug: "a-slug".to_owned(),
48        };
49
50        serde_test::assert_tokens(
51            &value,
52            &[
53                Token::Struct {
54                    name: "Sku",
55                    len: 6,
56                },
57                Token::Str("application_id"),
58                Token::NewtypeStruct { name: "Id" },
59                Token::Str("1"),
60                Token::Str("flags"),
61                Token::U64(1 << 7),
62                Token::Str("id"),
63                Token::NewtypeStruct { name: "Id" },
64                Token::Str("2"),
65                Token::Str("type"),
66                Token::U8(5),
67                Token::Str("name"),
68                Token::Str("a name"),
69                Token::Str("slug"),
70                Token::Str("a-slug"),
71                Token::StructEnd,
72            ],
73        );
74    }
75}