use serde_derive::{Deserialize, Serialize};
use crate::ids::IssuingCardId;
use crate::params::{Expandable, Metadata, Object, Timestamp};
use crate::resources::{
Address, CardBrand, Currency, IssuingCardShippingStatus, IssuingCardShippingType,
IssuingCardType, IssuingCardholder, MerchantCategory, SpendingLimit,
};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCard {
pub id: IssuingCardId,
pub brand: CardBrand,
#[serde(skip_serializing_if = "Option::is_none")]
pub cancellation_reason: Option<IssuingCardCancellationReason>,
pub cardholder: IssuingCardholder,
pub created: Timestamp,
pub currency: Currency,
#[serde(skip_serializing_if = "Option::is_none")]
pub cvc: Option<String>,
pub exp_month: i64,
pub exp_year: i64,
pub last4: String,
pub livemode: bool,
pub metadata: Metadata,
#[serde(skip_serializing_if = "Option::is_none")]
pub number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replaced_by: Option<Expandable<IssuingCard>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replacement_for: Option<Expandable<IssuingCard>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub replacement_reason: Option<IssuingCardReplacementReason>,
#[serde(skip_serializing_if = "Option::is_none")]
pub shipping: Option<IssuingCardShipping>,
pub spending_controls: IssuingCardAuthorizationControls,
pub status: IssuingCardStatus,
#[serde(rename = "type")]
pub type_: IssuingCardType,
}
impl Object for IssuingCard {
type Id = IssuingCardId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"issuing.card"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardAuthorizationControls {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_categories: Option<Vec<MerchantCategory>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub blocked_categories: Option<Vec<MerchantCategory>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spending_limits: Option<Vec<SpendingLimit>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spending_limits_currency: Option<Currency>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardShipping {
pub address: Address,
#[serde(skip_serializing_if = "Option::is_none")]
pub carrier: Option<IssuingCardShippingCarrier>,
#[serde(skip_serializing_if = "Option::is_none")]
pub eta: Option<Timestamp>,
pub name: String,
pub service: IssuingCardShippingService,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<IssuingCardShippingStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracking_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tracking_url: Option<String>,
#[serde(rename = "type")]
pub type_: IssuingCardShippingType,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardCancellationReason {
Lost,
Stolen,
}
impl IssuingCardCancellationReason {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardCancellationReason::Lost => "lost",
IssuingCardCancellationReason::Stolen => "stolen",
}
}
}
impl AsRef<str> for IssuingCardCancellationReason {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardCancellationReason {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardReplacementReason {
Damaged,
Expired,
Lost,
Stolen,
}
impl IssuingCardReplacementReason {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardReplacementReason::Damaged => "damaged",
IssuingCardReplacementReason::Expired => "expired",
IssuingCardReplacementReason::Lost => "lost",
IssuingCardReplacementReason::Stolen => "stolen",
}
}
}
impl AsRef<str> for IssuingCardReplacementReason {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardReplacementReason {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardShippingCarrier {
Fedex,
Usps,
}
impl IssuingCardShippingCarrier {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardShippingCarrier::Fedex => "fedex",
IssuingCardShippingCarrier::Usps => "usps",
}
}
}
impl AsRef<str> for IssuingCardShippingCarrier {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardShippingCarrier {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardShippingService {
Express,
Priority,
Standard,
}
impl IssuingCardShippingService {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardShippingService::Express => "express",
IssuingCardShippingService::Priority => "priority",
IssuingCardShippingService::Standard => "standard",
}
}
}
impl AsRef<str> for IssuingCardShippingService {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardShippingService {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardStatus {
Active,
Canceled,
Inactive,
}
impl IssuingCardStatus {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardStatus::Active => "active",
IssuingCardStatus::Canceled => "canceled",
IssuingCardStatus::Inactive => "inactive",
}
}
}
impl AsRef<str> for IssuingCardStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}