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, 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(default)]
pub charges_enabled: 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(default)]
pub details_submitted: 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(default)]
pub payouts_enabled: 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 platform_payments: Option<CapabilityStatus>,
}
#[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>>,
}
#[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(default)]
pub tax_id_provided: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub tax_id_registrar: Option<String>,
#[serde(default)]
pub vat_id_provided: bool,
}
#[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>,
}
#[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 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 document: Option<PersonVerificationDocumentParams>,
}
#[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 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 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 BusinessType {
Company,
Individual,
}
impl BusinessType {
pub fn as_str(&self) -> &'static str {
match self {
BusinessType::Company => "company",
BusinessType::Individual => "individual",
}
}
}
impl AsRef<str> for BusinessType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for BusinessType {
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,
PlatformPayments,
}
impl RequestedCapability {
pub fn as_str(&self) -> &'static str {
match self {
RequestedCapability::CardIssuing => "card_issuing",
RequestedCapability::CardPayments => "card_payments",
RequestedCapability::LegacyPayments => "legacy_payments",
RequestedCapability::PlatformPayments => "platform_payments",
}
}
}
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)
}
}