use super::common::*;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CreateReaderCheckoutRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub aade: Option<CreateReaderCheckoutRequestAade>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::nullable::deserialize"
)]
pub affiliate: Option<crate::Nullable<Affiliate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub card_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(
default,
skip_serializing_if = "Option::is_none",
deserialize_with = "crate::nullable::deserialize"
)]
pub installments: Option<crate::Nullable<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub return_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tip_rates: Option<Vec<f32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tip_timeout: Option<i64>,
pub total_amount: Money,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CreateReaderCheckoutResponse {
pub data: CreateReaderCheckoutResponseData,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Reader {
pub id: ReaderId,
pub name: ReaderName,
pub status: ReaderStatus,
pub device: ReaderDevice,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub service_account_id: Option<String>,
pub created_at: crate::datetime::DateTime,
pub updated_at: crate::datetime::DateTime,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ReaderDevice {
pub identifier: String,
pub model: String,
}
pub type ReaderId = String;
pub type ReaderName = String;
pub type ReaderPairingCode = String;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub enum ReaderStatus {
#[serde(rename = "unknown")]
Unknown,
#[serde(rename = "processing")]
Processing,
#[serde(rename = "paired")]
Paired,
#[serde(rename = "expired")]
Expired,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct StatusResponse {
pub data: StatusResponseData,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CreateReaderCheckoutRequestAade {
pub provider_id: String,
pub signature: String,
pub signature_data: String,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct AffiliateTags {
#[serde(
flatten,
default,
skip_serializing_if = "std::collections::HashMap::is_empty"
)]
pub additional_properties: std::collections::HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Affiliate {
pub app_id: String,
pub foreign_transaction_id: String,
pub key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags: Option<AffiliateTags>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct Money {
pub currency: String,
pub minor_unit: i64,
pub value: i64,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CreateReaderCheckoutResponseData {
pub client_transaction_id: String,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct StatusResponseData {
#[serde(skip_serializing_if = "Option::is_none")]
pub battery_level: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub battery_temperature: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connection_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub firmware_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_activity: Option<crate::datetime::DateTime>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
pub status: String,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct ListResponse {
pub items: Vec<Reader>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CreateBody {
pub pairing_code: ReaderPairingCode,
pub name: ReaderName,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct UpdateBody {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<ReaderName>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
}
use crate::client::Client;
#[derive(Debug)]
pub enum ListErrorBody {
Unauthorized(Problem),
}
#[derive(Debug)]
pub enum CreateErrorBody {
BadRequest(Problem),
NotFound(Problem),
Conflict(Problem),
}
#[derive(Debug)]
pub enum DeleteErrorBody {
NotFound(Problem),
}
#[derive(Debug)]
pub enum GetErrorBody {
NotFound(Problem),
}
#[derive(Debug)]
pub enum UpdateErrorBody {
Forbidden(Problem),
NotFound(Problem),
}
#[derive(Debug)]
pub enum CreateCheckoutErrorBody {
BadRequest(Problem),
Unauthorized(Problem),
NotFound(Problem),
UnprocessableEntity(Problem),
}
#[derive(Debug)]
pub enum GetStatusErrorBody {
BadRequest(Problem),
Unauthorized(Problem),
NotFound(Problem),
}
#[derive(Debug)]
pub enum TerminateCheckoutErrorBody {
BadRequest(Problem),
Unauthorized(Problem),
NotFound(Problem),
UnprocessableEntity(Problem),
}
#[derive(Debug)]
pub struct ReadersClient<'a> {
client: &'a Client,
}
impl<'a> ReadersClient<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
self.client
}
pub async fn list(
&self,
merchant_code: impl Into<String>,
) -> crate::error::SdkResult<ListResponse, ListErrorBody> {
let path = format!("/v0.1/merchants/{}/readers", merchant_code.into());
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.get(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
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: ListResponse = response.json().await?;
Ok(data)
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(ListErrorBody::Unauthorized(
body,
)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn create(
&self,
merchant_code: impl Into<String>,
body: CreateBody,
) -> crate::error::SdkResult<Reader, CreateErrorBody> {
let path = format!("/v0.1/merchants/{}/readers", merchant_code.into());
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::CREATED => {
let data: Reader = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(CreateErrorBody::BadRequest(
body,
)))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(CreateErrorBody::NotFound(body)))
}
reqwest::StatusCode::CONFLICT => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(CreateErrorBody::Conflict(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn delete(
&self,
merchant_code: impl Into<String>,
id: impl Into<String>,
) -> crate::error::SdkResult<(), DeleteErrorBody> {
let path = format!(
"/v0.1/merchants/{}/readers/{}",
merchant_code.into(),
id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.delete(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
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 => Ok(()),
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(DeleteErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn get(
&self,
merchant_code: impl Into<String>,
id: impl Into<String>,
) -> crate::error::SdkResult<Reader, GetErrorBody> {
let path = format!(
"/v0.1/merchants/{}/readers/{}",
merchant_code.into(),
id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.get(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
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: Reader = response.json().await?;
Ok(data)
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(GetErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn update(
&self,
merchant_code: impl Into<String>,
id: impl Into<String>,
body: UpdateBody,
) -> crate::error::SdkResult<Reader, UpdateErrorBody> {
let path = format!(
"/v0.1/merchants/{}/readers/{}",
merchant_code.into(),
id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.patch(&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: Reader = response.json().await?;
Ok(data)
}
reqwest::StatusCode::FORBIDDEN => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(UpdateErrorBody::Forbidden(
body,
)))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(UpdateErrorBody::NotFound(body)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn create_checkout(
&self,
merchant_code: impl Into<String>,
reader_id: impl Into<String>,
body: CreateReaderCheckoutRequest,
) -> crate::error::SdkResult<CreateReaderCheckoutResponse, CreateCheckoutErrorBody> {
let path = format!(
"/v0.1/merchants/{}/readers/{}/checkout",
merchant_code.into(),
reader_id.into()
);
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::CREATED => {
let data: CreateReaderCheckoutResponse = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
CreateCheckoutErrorBody::BadRequest(body),
))
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
CreateCheckoutErrorBody::Unauthorized(body),
))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
CreateCheckoutErrorBody::NotFound(body),
))
}
reqwest::StatusCode::UNPROCESSABLE_ENTITY => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
CreateCheckoutErrorBody::UnprocessableEntity(body),
))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn get_status(
&self,
merchant_code: impl Into<String>,
reader_id: impl Into<String>,
) -> crate::error::SdkResult<StatusResponse, GetStatusErrorBody> {
let path = format!(
"/v0.1/merchants/{}/readers/{}/status",
merchant_code.into(),
reader_id.into()
);
let url = format!("{}{}", self.client.base_url(), path);
let mut request = self
.client
.http_client()
.get(&url)
.header("User-Agent", crate::version::user_agent())
.timeout(self.client.timeout());
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: StatusResponse = response.json().await?;
Ok(data)
}
reqwest::StatusCode::BAD_REQUEST => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(GetStatusErrorBody::BadRequest(
body,
)))
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
GetStatusErrorBody::Unauthorized(body),
))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(GetStatusErrorBody::NotFound(
body,
)))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
pub async fn terminate_checkout(
&self,
merchant_code: impl Into<String>,
reader_id: impl Into<String>,
) -> crate::error::SdkResult<(), TerminateCheckoutErrorBody> {
let path = format!(
"/v0.1/merchants/{}/readers/{}/terminate",
merchant_code.into(),
reader_id.into()
);
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());
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::ACCEPTED => Ok(()),
reqwest::StatusCode::BAD_REQUEST => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
TerminateCheckoutErrorBody::BadRequest(body),
))
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
TerminateCheckoutErrorBody::Unauthorized(body),
))
}
reqwest::StatusCode::NOT_FOUND => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
TerminateCheckoutErrorBody::NotFound(body),
))
}
reqwest::StatusCode::UNPROCESSABLE_ENTITY => {
let body: Problem = response.json().await?;
Err(crate::error::SdkError::api(
TerminateCheckoutErrorBody::UnprocessableEntity(body),
))
}
_ => {
let body_bytes = response.bytes().await?;
let body = crate::error::UnknownApiBody::from_bytes(body_bytes.as_ref());
Err(crate::error::SdkError::unexpected(status, body))
}
}
}
}