use crate::{
core::{
error::PubNubError,
utils::headers::{APPLICATION_JSON, CONTENT_TYPE},
Deserializer, Serializer, Transport, TransportMethod, TransportRequest,
},
dx::{access::*, pubnub_client::PubNubClientInstance},
lib::{
alloc::{boxed::Box, format, string::ToString, vec},
collections::HashMap,
},
};
use derive_builder::Builder;
#[derive(Builder)]
#[builder(
pattern = "owned",
build_fn(vis = "pub(in crate::dx::access)", validate = "Self::validate"),
no_std
)]
pub struct GrantTokenRequest<'pa, T, S, D>
where
S: for<'se, 'rq> Serializer<'se, GrantTokenPayload<'rq>>,
{
#[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
pub(in crate::dx::access) pubnub_client: PubNubClientInstance<T, D>,
#[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
pub(in crate::dx::access) serializer: S,
#[builder(field(vis = "pub(in crate::dx::access)"), setter(custom))]
pub(in crate::dx::access) ttl: usize,
#[builder(
field(vis = "pub(in crate::dx::access)"),
setter(into, strip_option),
default = "None"
)]
pub authorized_user_id: Option<String>,
#[builder(
field(vis = "pub(in crate::dx::access)"),
setter(strip_option),
default = "None"
)]
pub meta: Option<HashMap<String, MetaValue>>,
#[builder(
field(vis = "pub(in crate::dx::access)"),
setter(strip_option),
default = "None"
)]
pub resources: Option<&'pa [Box<dyn permissions::Permission>]>,
#[builder(
field(vis = "pub(in crate::dx::access)"),
setter(strip_option),
default = "None"
)]
pub patterns: Option<&'pa [Box<dyn permissions::Permission>]>,
}
#[cfg(not(feature = "serde"))]
pub struct GrantTokenRequestWithSerializerBuilder<T, D> {
pub(in crate::dx::access) pubnub_client: PubNubClientInstance<T, D>,
pub(in crate::dx::access) ttl: usize,
}
impl<'pa, T, S, D> GrantTokenRequest<'pa, T, S, D>
where
S: for<'se, 'rq> Serializer<'se, GrantTokenPayload<'rq>>,
{
pub(in crate::dx::access) fn transport_request(&self) -> TransportRequest {
let config = &self.pubnub_client.config;
let payload = GrantTokenPayload::new(self);
let body = self.serializer.serialize(&payload).unwrap_or(vec![]);
TransportRequest {
path: format!("/v3/pam/{}/grant", &config.subscribe_key),
query_parameters: Default::default(),
method: TransportMethod::Post,
headers: [(CONTENT_TYPE.to_string(), APPLICATION_JSON.to_string())].into(),
body: if !body.is_empty() { Some(body) } else { None },
#[cfg(feature = "std")]
timeout: config.transport.request_timeout,
}
}
}
impl<'pa, T, S, D> GrantTokenRequestBuilder<'pa, T, S, D>
where
S: for<'se, 'rq> Serializer<'se, GrantTokenPayload<'rq>>,
{
fn validate(&self) -> Result<(), String> {
builders::validate_configuration(&self.pubnub_client)
}
}
impl<'pa, T, S, D> GrantTokenRequestBuilder<'pa, T, S, D>
where
T: Transport + 'static,
S: for<'se, 'rq> Serializer<'se, GrantTokenPayload<'rq>>,
D: Deserializer + 'static,
{
pub async fn execute(self) -> Result<GrantTokenResult, PubNubError> {
let request = self
.build()
.map_err(|err| PubNubError::general_api_error(err.to_string(), None, None))?;
let transport_request = request.transport_request();
let client = request.pubnub_client.clone();
let deserializer = client.deserializer.clone();
transport_request
.send::<GrantTokenResponseBody, _, _, _>(
&client.transport,
deserializer,
#[cfg(feature = "std")]
&client.config.transport.retry_configuration,
#[cfg(feature = "std")]
&client.runtime,
)
.await
}
}
#[cfg(feature = "blocking")]
impl<'pa, T, S, D> GrantTokenRequestBuilder<'pa, T, S, D>
where
T: crate::core::blocking::Transport,
S: for<'se, 'rq> Serializer<'se, GrantTokenPayload<'rq>>,
D: Deserializer + 'static,
{
pub fn execute_blocking(self) -> Result<GrantTokenResult, PubNubError> {
let request = self
.build()
.map_err(|err| PubNubError::general_api_error(err.to_string(), None, None))?;
let transport_request = request.transport_request();
let client = request.pubnub_client.clone();
let deserializer = client.deserializer.clone();
transport_request
.send_blocking::<GrantTokenResponseBody, _, _, _>(&client.transport, deserializer)
}
}
#[cfg(not(feature = "serde"))]
impl<T, D> GrantTokenRequestWithSerializerBuilder<T, D> {
pub fn serialize_with<'request, S>(
self,
serializer: S,
) -> GrantTokenRequestBuilder<'request, T, S, D>
where
S: for<'se, 'rq> Serializer<'se, GrantTokenPayload<'rq>>,
{
GrantTokenRequestBuilder {
pubnub_client: Some(self.pubnub_client),
ttl: Some(self.ttl),
serializer: Some(serializer),
..Default::default()
}
}
}