pubnub/dx/access/builders/
revoke.rs1use crate::{
6 core::{
7 error::PubNubError,
8 utils::{
9 encoding::url_encode,
10 headers::{APPLICATION_JSON, CONTENT_TYPE},
11 },
12 Deserializer, Transport, TransportMethod, TransportRequest,
13 },
14 dx::{access::*, pubnub_client::PubNubClientInstance},
15 lib::alloc::{format, string::ToString},
16};
17use derive_builder::Builder;
18
19#[derive(Builder)]
20#[builder(
21 pattern = "owned",
22 build_fn(vis = "pub(in crate::dx::access)", validate = "Self::validate"),
23 no_std
24)]
25pub struct RevokeTokenRequest<T, D> {
36 #[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
40 pub(in crate::dx::access) pubnub_client: PubNubClientInstance<T, D>,
41
42 #[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
44 pub(super) token: String,
45}
46
47impl<T, D> RevokeTokenRequest<T, D> {
48 pub(in crate::dx::access) fn transport_request(&self) -> TransportRequest {
50 let config = &self.pubnub_client.config;
51
52 TransportRequest {
53 path: format!(
54 "/v3/pam/{}/grant/{}",
55 &config.subscribe_key,
56 url_encode(self.token.as_bytes())
57 ),
58 method: TransportMethod::Delete,
59 headers: [(CONTENT_TYPE.to_string(), APPLICATION_JSON.to_string())].into(),
60 #[cfg(feature = "std")]
61 timeout: config.transport.request_timeout,
62 ..Default::default()
63 }
64 }
65}
66
67impl<T, D> RevokeTokenRequestBuilder<T, D> {
68 fn validate(&self) -> Result<(), String> {
73 builders::validate_configuration(&self.pubnub_client)
74 }
75}
76
77impl<T, D> RevokeTokenRequestBuilder<T, D>
78where
79 T: Transport + 'static,
80 D: Deserializer + 'static,
81{
82 pub async fn execute(self) -> Result<RevokeTokenResult, PubNubError> {
84 let request = self
86 .build()
87 .map_err(|err| PubNubError::general_api_error(err.to_string(), None, None))?;
88
89 let transport_request = request.transport_request();
90 let client = request.pubnub_client.clone();
91 let deserializer = client.deserializer.clone();
92
93 transport_request
94 .send::<RevokeTokenResponseBody, _, _, _>(
95 &client.transport,
96 deserializer,
97 #[cfg(feature = "std")]
98 &client.config.transport.retry_configuration,
99 #[cfg(feature = "std")]
100 &client.runtime,
101 )
102 .await
103 }
104}
105
106#[cfg(feature = "blocking")]
107impl<T, D> RevokeTokenRequestBuilder<T, D>
108where
109 T: crate::core::blocking::Transport,
110 D: Deserializer + 'static,
111{
112 pub fn execute_blocking(self) -> Result<RevokeTokenResult, PubNubError> {
139 let request = self
141 .build()
142 .map_err(|err| PubNubError::general_api_error(err.to_string(), None, None))?;
143
144 let transport_request = request.transport_request();
145 let client = request.pubnub_client.clone();
146 let deserializer = client.deserializer.clone();
147 transport_request
148 .send_blocking::<RevokeTokenResponseBody, _, _, _>(&client.transport, deserializer)
149 }
150}