twilight_http/request/application/monetization/
create_test_entitlement.rs1use 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
21pub 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}