use super::common::*;
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct AccountLegacy {
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct AddressWithDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line1: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line2: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_id: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub landline: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country_details: Option<CountryDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timeoffset_details: Option<TimeoffsetDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub state_id: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct AppSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub checkout_preference: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub include_vat: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manual_entry_tutorial: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mobile_payment_tutorial: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mobile_payment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reader_payment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cash_payment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub advanced_mode: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expected_max_transaction_amount: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub manual_entry: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub terminal_mode_tutorial: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tipping: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tip_rates: Option<Vec<f32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub barcode_scanner: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub referral: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct BankAccount {
#[serde(skip_serializing_if = "Option::is_none")]
pub bank_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub branch_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub swift: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iban: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_category: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub account_holder_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub primary: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bank_name: Option<String>,
}
pub type BusinessOwners = Vec<serde_json::Value>;
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct CountryDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iso_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub en_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub native_name: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct DoingBusinessAsLegacy {
#[serde(skip_serializing_if = "Option::is_none")]
pub business_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_registration_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub website: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<DoingBusinessAsLegacyAddress>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct LegalTypeLegacy {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sole_trader: Option<bool>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct MerchantAccount {
#[serde(skip_serializing_if = "Option::is_none")]
pub account: Option<AccountLegacy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub personal_profile: Option<PersonalProfileLegacy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_profile: Option<MerchantProfileLegacy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_settings: Option<AppSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub permissions: Option<PermissionsLegacy>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct MerchantProfileLegacy {
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub website: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub legal_type: Option<LegalTypeLegacy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merchant_category_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mobile_phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company_registration_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub permanent_certificate_access_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nature_and_purpose: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<AddressWithDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub business_owners: Option<BusinessOwners>,
#[serde(skip_serializing_if = "Option::is_none")]
pub doing_business_as: Option<DoingBusinessAsLegacy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub settings: Option<MerchantSettings>,
#[serde(skip_serializing_if = "Option::is_none")]
pub vat_rates: Option<VatRates>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bank_accounts: Option<Vec<BankAccount>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub extdev: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_zone_migrated: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct MerchantSettings {
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_period: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_on_demand_available: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_on_demand: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub printers_enabled: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub payout_instrument: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moto_payment: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stone_merchant_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub daily_payout_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub monthly_payout_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gross_settlement: Option<bool>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct PermissionsLegacy {
#[serde(skip_serializing_if = "Option::is_none")]
pub create_moto_payments: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_transaction_history_view: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub refund_transactions: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub create_referral: Option<bool>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct PersonalProfileLegacy {
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub date_of_birth: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mobile_phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<AddressWithDetails>,
#[serde(skip_serializing_if = "Option::is_none")]
pub complete: Option<bool>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct TimeoffsetDetails {
#[serde(skip_serializing_if = "Option::is_none")]
pub post_code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dst: Option<bool>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct VatRates {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rate: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ordering: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct DoingBusinessAsLegacyAddress {
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line1: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address_line2: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_id: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub post_code: Option<String>,
}
#[derive(Debug, Clone, Default, serde::Serialize, serde::Deserialize)]
pub struct GetParams {
#[serde(rename = "include[]")]
#[serde(skip_serializing_if = "Option::is_none")]
pub include: Option<Vec<String>>,
}
use crate::client::Client;
#[derive(Debug)]
pub enum GetErrorBody {
Unauthorized(Error),
}
#[derive(Debug)]
pub enum GetMerchantProfileErrorBody {
Unauthorized(Error),
Forbidden(ErrorForbidden),
}
#[derive(Debug)]
pub enum GetDoingBusinessAsErrorBody {
Unauthorized(Error),
}
#[derive(Debug)]
pub enum GetPersonalProfileErrorBody {
Unauthorized(Error),
}
#[derive(Debug)]
pub struct MerchantClient<'a> {
client: &'a Client,
}
impl<'a> MerchantClient<'a> {
pub(crate) fn new(client: &'a Client) -> Self {
Self { client }
}
pub fn client(&self) -> &Client {
self.client
}
pub async fn get(
&self,
params: GetParams,
) -> crate::error::SdkResult<MerchantAccount, GetErrorBody> {
let path = "/v0.1/me";
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);
}
if let Some(ref value) = params.include {
request = request.query(&[("include[]", value)]);
}
let response = request.send().await?;
let status = response.status();
match status {
reqwest::StatusCode::OK => {
let data: MerchantAccount = response.json().await?;
Ok(data)
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Error = response.json().await?;
Err(crate::error::SdkError::api(GetErrorBody::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 get_merchant_profile(
&self,
) -> crate::error::SdkResult<MerchantProfileLegacy, GetMerchantProfileErrorBody> {
let path = "/v0.1/me/merchant-profile";
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: MerchantProfileLegacy = response.json().await?;
Ok(data)
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Error = response.json().await?;
Err(crate::error::SdkError::api(
GetMerchantProfileErrorBody::Unauthorized(body),
))
}
reqwest::StatusCode::FORBIDDEN => {
let body: ErrorForbidden = response.json().await?;
Err(crate::error::SdkError::api(
GetMerchantProfileErrorBody::Forbidden(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_doing_business_as(
&self,
) -> crate::error::SdkResult<DoingBusinessAsLegacy, GetDoingBusinessAsErrorBody> {
let path = "/v0.1/me/merchant-profile/doing-business-as";
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: DoingBusinessAsLegacy = response.json().await?;
Ok(data)
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Error = response.json().await?;
Err(crate::error::SdkError::api(
GetDoingBusinessAsErrorBody::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 get_personal_profile(
&self,
) -> crate::error::SdkResult<PersonalProfileLegacy, GetPersonalProfileErrorBody> {
let path = "/v0.1/me/personal-profile";
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: PersonalProfileLegacy = response.json().await?;
Ok(data)
}
reqwest::StatusCode::UNAUTHORIZED => {
let body: Error = response.json().await?;
Err(crate::error::SdkError::api(
GetPersonalProfileErrorBody::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))
}
}
}
}