use super::common::*;
#[derive(
Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize, typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct Token {
#[builder(setter(into, doc = "Sets [`access_token`](Token::access_token)."))]
pub access_token: String,
#[builder(setter(doc = "Sets [`expires_in`](Token::expires_in)."))]
pub expires_in: i64,
#[builder(setter(doc = "Sets [`token_type`](Token::token_type)."))]
pub token_type: TokenTokenType,
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum TokenTokenType {
Bearer,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum CreateRequestActionsItem {
#[serde(rename = "checkout")]
Checkout,
#[serde(untagged)]
Other(String),
}
#[derive(
Debug,
Clone,
Default,
PartialEq,
serde::Serialize,
serde::Deserialize,
typed_builder::TypedBuilder,
)]
#[builder(doc)]
pub struct CreateRequest {
#[builder(setter(doc = "Sets [`actions`](CreateRequest::actions)."))]
pub actions: Vec<CreateRequestActionsItem>,
}
use crate::client::Client;
#[derive(Debug, PartialEq)]
pub enum CreateErrorBody {
BadRequest(Problem),
Unauthorized(Problem),
Forbidden(Problem),
}
impl crate::error::ProblemDetails for CreateErrorBody {
fn problem(&self) -> Option<&crate::resources::common::Problem> {
match self {
Self::BadRequest(problem) => Some(problem),
Self::Unauthorized(problem) => Some(problem),
Self::Forbidden(problem) => Some(problem),
}
}
}
#[derive(Debug)]
pub struct TokensClient<'a> {
client: &'a Client,
}
impl<'a> TokensClient<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
self.client
}
pub async fn create(
&self,
merchant_code: impl AsRef<str>,
body: CreateRequest,
) -> crate::error::SdkResult<Token, CreateErrorBody> {
let path = format!("/v0.1/merchants/{}/tokens", merchant_code.as_ref());
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.post(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout())
.json(&body);
if let Some(authorization) = self.client.authorization() {
request = request.header("Authorization", format!("Bearer {}", authorization));
}
for (header_name, header_value) in self.client.runtime_headers() {
request = request.header(*header_name, header_value);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: Token = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(CreateErrorBody::BadRequest)
})
.await)
}
reqwest::StatusCode::UNAUTHORIZED => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(CreateErrorBody::Unauthorized)
})
.await)
}
reqwest::StatusCode::FORBIDDEN => {
Err(crate::error::SdkError::from_response(response, |raw| {
serde_json::from_slice::<Problem>(raw).map(CreateErrorBody::Forbidden)
})
.await)
}
_ => Err(crate::error::SdkError::unexpected_response(response).await),
}
}
}