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