Skip to main content

twilight_http/request/application/monetization/
create_test_entitlement.rs

1use std::future::IntoFuture;
2
3use serde::ser::{Serialize, SerializeStruct, Serializer};
4use twilight_model::{
5    application::monetization::Entitlement,
6    id::{
7        Id,
8        marker::{ApplicationMarker, GuildMarker, SkuMarker, UserMarker},
9    },
10};
11
12#[cfg(not(target_os = "wasi"))]
13use crate::{Response, response::ResponseFuture};
14
15use crate::{
16    Client, Error,
17    request::{Request, TryIntoRequest},
18    routing::Route,
19};
20
21/// Owner of a test entitlement.
22pub enum CreateTestEntitlementOwner {
23    Guild(Id<GuildMarker>),
24    User(Id<UserMarker>),
25}
26
27impl CreateTestEntitlementOwner {
28    pub const fn id(&self) -> u64 {
29        match self {
30            CreateTestEntitlementOwner::Guild(id) => id.get(),
31            CreateTestEntitlementOwner::User(id) => id.get(),
32        }
33    }
34
35    pub const fn kind(&self) -> u8 {
36        match self {
37            CreateTestEntitlementOwner::Guild(_) => 1,
38            CreateTestEntitlementOwner::User(_) => 2,
39        }
40    }
41}
42
43struct CreateTestEntitlementFields {
44    sku_id: Id<SkuMarker>,
45    owner: CreateTestEntitlementOwner,
46}
47
48impl Serialize for CreateTestEntitlementFields {
49    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
50    where
51        S: Serializer,
52    {
53        let mut state = serializer.serialize_struct("CreateTestEntitlementFields", 2)?;
54        state.serialize_field("sku_id", &self.sku_id.get())?;
55        state.serialize_field("owner_id", &self.owner.id())?;
56        state.serialize_field("owner_type", &self.owner.kind())?;
57        state.end()
58    }
59}
60
61pub struct CreateTestEntitlement<'a> {
62    application_id: Id<ApplicationMarker>,
63    fields: CreateTestEntitlementFields,
64    http: &'a Client,
65}
66
67impl<'a> CreateTestEntitlement<'a> {
68    pub(crate) const fn new(
69        http: &'a Client,
70        application_id: Id<ApplicationMarker>,
71        sku_id: Id<SkuMarker>,
72        owner: CreateTestEntitlementOwner,
73    ) -> Self {
74        Self {
75            application_id,
76            fields: CreateTestEntitlementFields { sku_id, owner },
77            http,
78        }
79    }
80}
81
82#[cfg(not(target_os = "wasi"))]
83impl IntoFuture for CreateTestEntitlement<'_> {
84    type Output = Result<Response<Entitlement>, Error>;
85
86    type IntoFuture = ResponseFuture<Entitlement>;
87
88    fn into_future(self) -> Self::IntoFuture {
89        let http = self.http;
90
91        match self.try_into_request() {
92            Ok(request) => http.request(request),
93            Err(source) => ResponseFuture::error(source),
94        }
95    }
96}
97
98impl TryIntoRequest for CreateTestEntitlement<'_> {
99    fn try_into_request(self) -> Result<Request, Error> {
100        Request::builder(&Route::CreateTestEntitlement {
101            application_id: self.application_id.get(),
102        })
103        .json(&self.fields)
104        .build()
105    }
106}
107
108#[cfg(test)]
109mod tests {
110    use serde_test::Token;
111    use twilight_model::id::Id;
112
113    use super::{CreateTestEntitlementFields, CreateTestEntitlementOwner};
114
115    #[test]
116    fn fields_serialization() {
117        let value = CreateTestEntitlementFields {
118            sku_id: Id::new(1),
119            owner: CreateTestEntitlementOwner::Guild(Id::new(2)),
120        };
121
122        serde_test::assert_ser_tokens(
123            &value,
124            &[
125                Token::Struct {
126                    name: "CreateTestEntitlementFields",
127                    len: 2,
128                },
129                Token::Str("sku_id"),
130                Token::U64(1),
131                Token::Str("owner_id"),
132                Token::U64(2),
133                Token::Str("owner_type"),
134                Token::U8(1),
135                Token::StructEnd,
136            ],
137        );
138    }
139}