use crate::errors::InvalidCurrencyError;
use derive_builder::Builder;
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
use std::str::FromStr;
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(missing_docs)]
pub enum PhoneType {
Fax,
Home,
Mobile,
Other,
Pager,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
pub struct AddressDetails {
pub street_number: Option<String>,
pub street_name: Option<String>,
pub street_type: Option<String>,
pub delivery_service: Option<String>,
pub building_name: Option<String>,
pub sub_building: Option<String>,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Builder)]
#[builder(setter(strip_option, into), default)]
pub struct Address {
pub address_line_1: Option<String>,
pub address_line_2: Option<String>,
pub admin_area_2: Option<String>,
pub admin_area_1: Option<String>,
pub postal_code: Option<String>,
pub country_code: Option<String>,
pub address_details: Option<AddressDetails>,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Builder)]
#[builder(setter(strip_option, into))]
pub struct Money {
pub currency_code: Currency,
pub value: String,
}
macro_rules! impl_money {
($name:ident, $type:expr) => {
#[doc=concat!("Creates a instance of Money with the currency ", stringify!($type))]
pub fn $name(value: impl ToString) -> Self {
Self {
currency_code: $type,
value: value.to_string(),
}
}
};
}
impl Money {
impl_money!(eur, Currency::EUR);
impl_money!(usd, Currency::USD);
impl_money!(brl, Currency::BRL);
impl_money!(cny, Currency::CNY);
impl_money!(czk, Currency::CZK);
impl_money!(jpy, Currency::JPY);
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone, Copy)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
#[allow(missing_docs)]
pub enum LinkMethod {
Get,
Post,
Put,
Delete,
Head,
Connect,
Options,
Patch,
}
#[skip_serializing_none]
#[derive(Debug, Default, Serialize, Deserialize, Clone, Eq, PartialEq)]
pub struct LinkDescription {
pub href: String,
pub rel: Option<String>,
pub method: Option<LinkMethod>,
}
#[derive(Debug, Serialize, Deserialize, PartialEq, Eq, Clone, Copy)]
pub enum Currency {
AUD,
BRL,
CAD,
CNY,
CZK,
DKK,
EUR,
HKD,
HUF,
INR,
ILS,
JPY,
MYR,
MXN,
TWD,
NZD,
NOK,
PHP,
PLN,
GBP,
RUB,
SGD,
SEK,
CHF,
THB,
USD,
}
impl Default for Currency {
fn default() -> Self {
Self::EUR
}
}
impl std::fmt::Display for Currency {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
std::fmt::Debug::fmt(&self, f)
}
}
impl FromStr for Currency {
type Err = InvalidCurrencyError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"AUD" => Ok(Self::AUD),
"BRL" => Ok(Self::BRL),
"CAD" => Ok(Self::CAD),
"CNY" => Ok(Self::CNY),
"CZK" => Ok(Self::CZK),
"DKK" => Ok(Self::DKK),
"EUR" => Ok(Self::EUR),
"HKD" => Ok(Self::HKD),
"HUF" => Ok(Self::HUF),
"INR" => Ok(Self::INR),
"ILS" => Ok(Self::ILS),
"JPY" => Ok(Self::JPY),
"MYR" => Ok(Self::MYR),
"MXN" => Ok(Self::MXN),
"NOK" => Ok(Self::NOK),
"PHP" => Ok(Self::PHP),
"PLN" => Ok(Self::PLN),
"GBP" => Ok(Self::GBP),
"RUB" => Ok(Self::RUB),
"SGD" => Ok(Self::SGD),
"SEK" => Ok(Self::SGD),
"CHF" => Ok(Self::CHF),
"THB" => Ok(Self::THB),
"USD" => Ok(Self::USD),
cur => Err(InvalidCurrencyError(cur.to_owned())),
}
}
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
pub struct AuthorizationStatusDetails {
pub reason: AuthorizationStatusDetailsReason,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum AuthorizationStatusDetailsReason {
PendingReview,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum SellerProtectionStatus {
Eligible,
PartiallyEligible,
NotEligible,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Copy, Clone)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum DisputeCategory {
ItemNotReceived,
UnauthorizedTransaction,
}
#[derive(Debug, Serialize, Deserialize, Eq, PartialEq, Clone)]
pub struct SellerProtection {
pub status: SellerProtectionStatus,
pub dispute_categories: Vec<DisputeCategory>,
}