use crate::ids::IssuingCardholderId;
use crate::params::{Metadata, Object, Timestamp};
use crate::resources::{Address, Currency, MerchantCategory, SpendingLimit};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholder {
pub id: IssuingCardholderId,
#[serde(skip_serializing_if = "Option::is_none")]
pub authorization_controls: Option<IssuingCardholderAuthorizationControls>,
pub billing: IssuingCardholderAddress,
pub created: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
pub is_default: bool,
pub livemode: bool,
pub metadata: Metadata,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone_number: Option<String>,
pub status: IssuingCardholderStatus,
#[serde(rename = "type")]
pub type_: IssuingCardholderType,
}
impl Object for IssuingCardholder {
type Id = IssuingCardholderId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"issuing.cardholder"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderAddress {
pub address: Address,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IssuingCardholderAuthorizationControls {
#[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(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IssuingCardholderStatus {
Active,
Blocked,
Inactive,
Pending,
}
impl IssuingCardholderStatus {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardholderStatus::Active => "active",
IssuingCardholderStatus::Blocked => "blocked",
IssuingCardholderStatus::Inactive => "inactive",
IssuingCardholderStatus::Pending => "pending",
}
}
}
impl AsRef<str> for IssuingCardholderStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardholderStatus {
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 IssuingCardholderType {
BusinessEntity,
Individual,
}
impl IssuingCardholderType {
pub fn as_str(self) -> &'static str {
match self {
IssuingCardholderType::BusinessEntity => "business_entity",
IssuingCardholderType::Individual => "individual",
}
}
}
impl AsRef<str> for IssuingCardholderType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IssuingCardholderType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}