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 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
19pub 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}