use crate::config::{Client, Response};
use crate::ids::AccountId;
use crate::params::{Deleted, Expand, Expandable, List, Metadata, Object, RangeQuery, Timestamp};
use crate::resources::{
    Address, BankAccount, BusinessType, Card, Currency, DelayDays, Dob, File, Person, Weekday,
};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Account {
    
    pub id: AccountId,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub business_profile: Option<BusinessProfile>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub business_type: Option<BusinessType>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub capabilities: Option<AccountCapabilities>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub charges_enabled: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub company: Option<Company>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub country: Option<String>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created: Option<Timestamp>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_currency: Option<Currency>,
    
    #[serde(default)]
    pub deleted: bool,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub details_submitted: Option<bool>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    
    #[serde(default)]
    pub external_accounts: List<ExternalAccount>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub individual: Option<Person>,
    
    
    
    #[serde(default)]
    pub metadata: Metadata,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub payouts_enabled: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub requirements: Option<AccountRequirements>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub settings: Option<AccountSettings>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tos_acceptance: Option<TosAcceptance>,
    
    
    
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub type_: Option<AccountType>,
}
impl Account {
    
    
    
    pub fn list(client: &Client, params: ListAccounts<'_>) -> Response<List<Account>> {
        client.get_query("/accounts", ¶ms)
    }
    
    
    
    
    
    pub fn create(client: &Client, params: CreateAccount<'_>) -> Response<Account> {
        client.post_form("/accounts", ¶ms)
    }
    
    pub fn retrieve(client: &Client, id: &AccountId, expand: &[&str]) -> Response<Account> {
        client.get_query(&format!("/accounts/{}", id), &Expand { expand })
    }
    
    
    
    
    
    
    pub fn update(client: &Client, id: &AccountId, params: UpdateAccount<'_>) -> Response<Account> {
        client.post_form(&format!("/accounts/{}", id), ¶ms)
    }
    
    
    
    
    
    pub fn delete(client: &Client, id: &AccountId) -> Response<Deleted<AccountId>> {
        client.delete(&format!("/accounts/{}", id))
    }
}
impl Object for Account {
    type Id = AccountId;
    fn id(&self) -> Self::Id {
        self.id.clone()
    }
    fn object(&self) -> &'static str {
        "account"
    }
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BusinessProfile {
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mcc: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub product_description: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub support_address: Option<Address>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub support_email: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub support_phone: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub support_url: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub url: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountCapabilities {
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub card_payments: Option<CapabilityStatus>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub legacy_payments: Option<CapabilityStatus>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub transfers: Option<AccountCapabilitiesTransfers>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountRequirements {
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub current_deadline: Option<Timestamp>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub currently_due: Option<Vec<String>>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub disabled_reason: Option<String>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub eventually_due: Option<Vec<String>>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub past_due: Option<Vec<String>>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub pending_verification: Option<Vec<String>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountSettings {
    pub branding: BrandingSettings,
    pub card_payments: CardPaymentsSettings,
    pub dashboard: DashboardSettings,
    pub payments: PaymentsSettings,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub payouts: Option<PayoutSettings>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BrandingSettings {
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub icon: Option<Expandable<File>>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub logo: Option<Expandable<File>>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub primary_color: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CardPaymentsSettings {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub decline_on: Option<DeclineChargeOn>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor_prefix: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DashboardSettings {
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub display_name: Option<String>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub timezone: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DeclineChargeOn {
    
    
    
    pub avs_failure: bool,
    
    
    
    pub cvc_failure: bool,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PaymentsSettings {
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor_kana: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor_kanji: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PayoutSettings {
    
    
    
    
    pub debit_negative_balances: bool,
    pub schedule: TransferSchedule,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct TosAcceptance {
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub date: Option<Timestamp>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ip: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_agent: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Company {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<Address>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address_kana: Option<Address>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address_kanji: Option<Address>,
    
    
    
    pub directors_provided: bool,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name_kana: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name_kanji: Option<String>,
    
    
    
    
    pub owners_provided: bool,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tax_id_provided: Option<bool>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tax_id_registrar: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub vat_id_provided: Option<bool>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub verification: Option<LegalEntityCompanyVerification>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LegalEntityCompanyVerification {
    pub document: LegalEntityCompanyVerificationDocument,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LegalEntityCompanyVerificationDocument {
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub back: Option<Expandable<File>>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub details: Option<String>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub details_code: Option<String>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub front: Option<Expandable<File>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct TransferSchedule {
    
    pub delay_days: u32,
    
    
    
    pub interval: String,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub monthly_anchor: Option<u8>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub weekly_anchor: Option<Weekday>,
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct CreateAccount<'a> {
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub account_token: Option<&'a str>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub business_profile: Option<BusinessProfile>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub business_type: Option<&'a str>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub company: Option<CompanyParams>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub country: Option<&'a str>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_currency: Option<Currency>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<&'a str>,
    
    #[serde(skip_serializing_if = "Expand::is_empty")]
    pub expand: &'a [&'a str],
    
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub external_account: Option<&'a str>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub individual: Option<PersonParams>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub metadata: Option<Metadata>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub requested_capabilities: Option<Vec<RequestedCapability>>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub settings: Option<AccountSettingsParams>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tos_acceptance: Option<AcceptTos>,
    
    
    
    #[serde(rename = "type")]
    #[serde(skip_serializing_if = "Option::is_none")]
    pub type_: Option<AccountType>,
}
impl<'a> CreateAccount<'a> {
    pub fn new() -> Self {
        CreateAccount {
            account_token: Default::default(),
            business_profile: Default::default(),
            business_type: Default::default(),
            company: Default::default(),
            country: Default::default(),
            default_currency: Default::default(),
            email: Default::default(),
            expand: Default::default(),
            external_account: Default::default(),
            individual: Default::default(),
            metadata: Default::default(),
            requested_capabilities: Default::default(),
            settings: Default::default(),
            tos_acceptance: Default::default(),
            type_: Default::default(),
        }
    }
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct ListAccounts<'a> {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub created: Option<RangeQuery<Timestamp>>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ending_before: Option<AccountId>,
    
    #[serde(skip_serializing_if = "Expand::is_empty")]
    pub expand: &'a [&'a str],
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub limit: Option<u64>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub starting_after: Option<AccountId>,
}
impl<'a> ListAccounts<'a> {
    pub fn new() -> Self {
        ListAccounts {
            created: Default::default(),
            ending_before: Default::default(),
            expand: Default::default(),
            limit: Default::default(),
            starting_after: Default::default(),
        }
    }
}
#[derive(Clone, Debug, Serialize, Default)]
pub struct UpdateAccount<'a> {
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub account_token: Option<&'a str>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub business_profile: Option<BusinessProfile>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub business_type: Option<&'a str>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub company: Option<CompanyParams>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub default_currency: Option<Currency>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<&'a str>,
    
    #[serde(skip_serializing_if = "Expand::is_empty")]
    pub expand: &'a [&'a str],
    
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub external_account: Option<&'a str>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub individual: Option<PersonParams>,
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub metadata: Option<Metadata>,
    
    
    
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub requested_capabilities: Option<Vec<RequestedCapability>>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub settings: Option<AccountSettingsParams>,
    
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tos_acceptance: Option<AcceptTos>,
}
impl<'a> UpdateAccount<'a> {
    pub fn new() -> Self {
        UpdateAccount {
            account_token: Default::default(),
            business_profile: Default::default(),
            business_type: Default::default(),
            company: Default::default(),
            default_currency: Default::default(),
            email: Default::default(),
            expand: Default::default(),
            external_account: Default::default(),
            individual: Default::default(),
            metadata: Default::default(),
            requested_capabilities: Default::default(),
            settings: Default::default(),
            tos_acceptance: Default::default(),
        }
    }
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AcceptTos {
    pub date: Timestamp,
    pub ip: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user_agent: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountSettingsParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub branding: Option<BrandingSettingsParams>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub card_payments: Option<CardPaymentsSettingsParams>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub payments: Option<PaymentsSettingsParams>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub payouts: Option<PayoutSettingsParams>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CompanyParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<Address>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address_kana: Option<Address>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address_kanji: Option<Address>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub directors_provided: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name_kana: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub name_kanji: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub owners_provided: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tax_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub tax_id_registrar: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub vat_id: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub verification: Option<CompanyParamsVerification>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PersonParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address: Option<Address>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address_kana: Option<Address>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub address_kanji: Option<Address>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub dob: Option<Dob>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub email: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub first_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub first_name_kana: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub first_name_kanji: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub gender: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub id_number: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_name: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_name_kana: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub last_name_kanji: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub maiden_name: Option<String>,
    #[serde(default)]
    pub metadata: Metadata,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub phone: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub ssn_last_4: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub verification: Option<PersonVerificationParams>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BrandingSettingsParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub icon: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub logo: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub primary_color: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CardPaymentsSettingsParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub decline_on: Option<DeclineChargeOnParams>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor_prefix: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CompanyParamsVerification {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub document: Option<CompanyParamsVerificationDocument>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PaymentsSettingsParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor_kana: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor_kanji: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PayoutSettingsParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub debit_negative_balances: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub schedule: Option<TransferScheduleParams>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub statement_descriptor: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PersonVerificationParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub additional_document: Option<PersonVerificationParamsAdditionalDocument>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub document: Option<PersonVerificationDocumentParams>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CompanyParamsVerificationDocument {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub back: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub front: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DeclineChargeOnParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub avs_failure: Option<bool>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub cvc_failure: Option<bool>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PersonVerificationDocumentParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub back: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub front: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PersonVerificationParamsAdditionalDocument {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub back: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub front: Option<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct TransferScheduleParams {
    #[serde(skip_serializing_if = "Option::is_none")]
    pub delay_days: Option<DelayDays>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub interval: Option<TransferScheduleInterval>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub monthly_anchor: Option<u8>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub weekly_anchor: Option<Weekday>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "object", rename_all = "snake_case")]
pub enum ExternalAccount {
    BankAccount(BankAccount),
    Card(Card),
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AccountCapabilitiesTransfers {
    Active,
    Inactive,
    Pending,
}
impl AccountCapabilitiesTransfers {
    pub fn as_str(self) -> &'static str {
        match self {
            AccountCapabilitiesTransfers::Active => "active",
            AccountCapabilitiesTransfers::Inactive => "inactive",
            AccountCapabilitiesTransfers::Pending => "pending",
        }
    }
}
impl AsRef<str> for AccountCapabilitiesTransfers {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}
impl std::fmt::Display for AccountCapabilitiesTransfers {
    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 AccountType {
    Custom,
    Express,
    Standard,
}
impl AccountType {
    pub fn as_str(self) -> &'static str {
        match self {
            AccountType::Custom => "custom",
            AccountType::Express => "express",
            AccountType::Standard => "standard",
        }
    }
}
impl AsRef<str> for AccountType {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}
impl std::fmt::Display for AccountType {
    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 CapabilityStatus {
    Active,
    Inactive,
    Pending,
}
impl CapabilityStatus {
    pub fn as_str(self) -> &'static str {
        match self {
            CapabilityStatus::Active => "active",
            CapabilityStatus::Inactive => "inactive",
            CapabilityStatus::Pending => "pending",
        }
    }
}
impl AsRef<str> for CapabilityStatus {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}
impl std::fmt::Display for CapabilityStatus {
    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 RequestedCapability {
    CardIssuing,
    CardPayments,
    LegacyPayments,
    Transfers,
}
impl RequestedCapability {
    pub fn as_str(self) -> &'static str {
        match self {
            RequestedCapability::CardIssuing => "card_issuing",
            RequestedCapability::CardPayments => "card_payments",
            RequestedCapability::LegacyPayments => "legacy_payments",
            RequestedCapability::Transfers => "transfers",
        }
    }
}
impl AsRef<str> for RequestedCapability {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}
impl std::fmt::Display for RequestedCapability {
    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 TransferScheduleInterval {
    Daily,
    Manual,
    Monthly,
    Weekly,
}
impl TransferScheduleInterval {
    pub fn as_str(self) -> &'static str {
        match self {
            TransferScheduleInterval::Daily => "daily",
            TransferScheduleInterval::Manual => "manual",
            TransferScheduleInterval::Monthly => "monthly",
            TransferScheduleInterval::Weekly => "weekly",
        }
    }
}
impl AsRef<str> for TransferScheduleInterval {
    fn as_ref(&self) -> &str {
        self.as_str()
    }
}
impl std::fmt::Display for TransferScheduleInterval {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        self.as_str().fmt(f)
    }
}