use serde_derive::{Deserialize, Serialize};
use crate::ids::CapabilityId;
use crate::params::{Expandable, Object, Timestamp};
use crate::resources::Account;
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Capability {
pub id: CapabilityId,
pub account: Expandable<Account>,
#[serde(skip_serializing_if = "Option::is_none")]
pub future_requirements: Option<Box<AccountCapabilityFutureRequirements>>,
pub requested: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub requested_at: Option<Box<Timestamp>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub requirements: Option<Box<AccountCapabilityRequirements>>,
pub status: CapabilityStatus,
}
impl Object for Capability {
type Id = CapabilityId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"capability"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountCapabilityFutureRequirements {
#[serde(skip_serializing_if = "Option::is_none")]
pub alternatives: Option<Box<Vec<AccountRequirementsAlternative>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_deadline: Option<Box<Timestamp>>,
pub currently_due: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled_reason: Option<Box<String>>,
pub errors: Vec<AccountRequirementsError>,
pub eventually_due: Vec<String>,
pub past_due: Vec<String>,
pub pending_verification: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountCapabilityRequirements {
#[serde(skip_serializing_if = "Option::is_none")]
pub alternatives: Option<Box<Vec<AccountRequirementsAlternative>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_deadline: Option<Box<Timestamp>>,
pub currently_due: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disabled_reason: Option<Box<String>>,
pub errors: Vec<AccountRequirementsError>,
pub eventually_due: Vec<String>,
pub past_due: Vec<String>,
pub pending_verification: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountRequirementsAlternative {
pub alternative_fields_due: Vec<String>,
pub original_fields_due: Vec<String>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AccountRequirementsError {
pub code: AccountRequirementsErrorCode,
pub reason: String,
pub requirement: String,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum AccountRequirementsErrorCode {
InvalidAddressCityStatePostalCode,
InvalidStreetAddress,
InvalidValueOther,
VerificationDocumentAddressMismatch,
VerificationDocumentAddressMissing,
VerificationDocumentCorrupt,
VerificationDocumentCountryNotSupported,
VerificationDocumentDobMismatch,
VerificationDocumentDuplicateType,
VerificationDocumentExpired,
VerificationDocumentFailedCopy,
VerificationDocumentFailedGreyscale,
VerificationDocumentFailedOther,
VerificationDocumentFailedTestMode,
VerificationDocumentFraudulent,
VerificationDocumentIdNumberMismatch,
VerificationDocumentIdNumberMissing,
VerificationDocumentIncomplete,
VerificationDocumentInvalid,
VerificationDocumentIssueOrExpiryDateMissing,
VerificationDocumentManipulated,
VerificationDocumentMissingBack,
VerificationDocumentMissingFront,
VerificationDocumentNameMismatch,
VerificationDocumentNameMissing,
VerificationDocumentNationalityMismatch,
VerificationDocumentNotReadable,
VerificationDocumentNotSigned,
VerificationDocumentNotUploaded,
VerificationDocumentPhotoMismatch,
VerificationDocumentTooLarge,
VerificationDocumentTypeNotSupported,
VerificationFailedAddressMatch,
VerificationFailedBusinessIecNumber,
VerificationFailedDocumentMatch,
VerificationFailedIdNumberMatch,
VerificationFailedKeyedIdentity,
VerificationFailedKeyedMatch,
VerificationFailedNameMatch,
VerificationFailedOther,
VerificationFailedTaxIdMatch,
VerificationFailedTaxIdNotIssued,
VerificationMissingExecutives,
VerificationMissingOwners,
VerificationRequiresAdditionalMemorandumOfAssociations,
}
impl AccountRequirementsErrorCode {
pub fn as_str(self) -> &'static str {
match self {
AccountRequirementsErrorCode::InvalidAddressCityStatePostalCode => "invalid_address_city_state_postal_code",
AccountRequirementsErrorCode::InvalidStreetAddress => "invalid_street_address",
AccountRequirementsErrorCode::InvalidValueOther => "invalid_value_other",
AccountRequirementsErrorCode::VerificationDocumentAddressMismatch => "verification_document_address_mismatch",
AccountRequirementsErrorCode::VerificationDocumentAddressMissing => "verification_document_address_missing",
AccountRequirementsErrorCode::VerificationDocumentCorrupt => "verification_document_corrupt",
AccountRequirementsErrorCode::VerificationDocumentCountryNotSupported => "verification_document_country_not_supported",
AccountRequirementsErrorCode::VerificationDocumentDobMismatch => "verification_document_dob_mismatch",
AccountRequirementsErrorCode::VerificationDocumentDuplicateType => "verification_document_duplicate_type",
AccountRequirementsErrorCode::VerificationDocumentExpired => "verification_document_expired",
AccountRequirementsErrorCode::VerificationDocumentFailedCopy => "verification_document_failed_copy",
AccountRequirementsErrorCode::VerificationDocumentFailedGreyscale => "verification_document_failed_greyscale",
AccountRequirementsErrorCode::VerificationDocumentFailedOther => "verification_document_failed_other",
AccountRequirementsErrorCode::VerificationDocumentFailedTestMode => "verification_document_failed_test_mode",
AccountRequirementsErrorCode::VerificationDocumentFraudulent => "verification_document_fraudulent",
AccountRequirementsErrorCode::VerificationDocumentIdNumberMismatch => "verification_document_id_number_mismatch",
AccountRequirementsErrorCode::VerificationDocumentIdNumberMissing => "verification_document_id_number_missing",
AccountRequirementsErrorCode::VerificationDocumentIncomplete => "verification_document_incomplete",
AccountRequirementsErrorCode::VerificationDocumentInvalid => "verification_document_invalid",
AccountRequirementsErrorCode::VerificationDocumentIssueOrExpiryDateMissing => "verification_document_issue_or_expiry_date_missing",
AccountRequirementsErrorCode::VerificationDocumentManipulated => "verification_document_manipulated",
AccountRequirementsErrorCode::VerificationDocumentMissingBack => "verification_document_missing_back",
AccountRequirementsErrorCode::VerificationDocumentMissingFront => "verification_document_missing_front",
AccountRequirementsErrorCode::VerificationDocumentNameMismatch => "verification_document_name_mismatch",
AccountRequirementsErrorCode::VerificationDocumentNameMissing => "verification_document_name_missing",
AccountRequirementsErrorCode::VerificationDocumentNationalityMismatch => "verification_document_nationality_mismatch",
AccountRequirementsErrorCode::VerificationDocumentNotReadable => "verification_document_not_readable",
AccountRequirementsErrorCode::VerificationDocumentNotSigned => "verification_document_not_signed",
AccountRequirementsErrorCode::VerificationDocumentNotUploaded => "verification_document_not_uploaded",
AccountRequirementsErrorCode::VerificationDocumentPhotoMismatch => "verification_document_photo_mismatch",
AccountRequirementsErrorCode::VerificationDocumentTooLarge => "verification_document_too_large",
AccountRequirementsErrorCode::VerificationDocumentTypeNotSupported => "verification_document_type_not_supported",
AccountRequirementsErrorCode::VerificationFailedAddressMatch => "verification_failed_address_match",
AccountRequirementsErrorCode::VerificationFailedBusinessIecNumber => "verification_failed_business_iec_number",
AccountRequirementsErrorCode::VerificationFailedDocumentMatch => "verification_failed_document_match",
AccountRequirementsErrorCode::VerificationFailedIdNumberMatch => "verification_failed_id_number_match",
AccountRequirementsErrorCode::VerificationFailedKeyedIdentity => "verification_failed_keyed_identity",
AccountRequirementsErrorCode::VerificationFailedKeyedMatch => "verification_failed_keyed_match",
AccountRequirementsErrorCode::VerificationFailedNameMatch => "verification_failed_name_match",
AccountRequirementsErrorCode::VerificationFailedOther => "verification_failed_other",
AccountRequirementsErrorCode::VerificationFailedTaxIdMatch => "verification_failed_tax_id_match",
AccountRequirementsErrorCode::VerificationFailedTaxIdNotIssued => "verification_failed_tax_id_not_issued",
AccountRequirementsErrorCode::VerificationMissingExecutives => "verification_missing_executives",
AccountRequirementsErrorCode::VerificationMissingOwners => "verification_missing_owners",
AccountRequirementsErrorCode::VerificationRequiresAdditionalMemorandumOfAssociations => "verification_requires_additional_memorandum_of_associations",
}
}
}
impl AsRef<str> for AccountRequirementsErrorCode {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for AccountRequirementsErrorCode {
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,
Disabled,
Inactive,
Pending,
Unrequested,
}
impl CapabilityStatus {
pub fn as_str(self) -> &'static str {
match self {
CapabilityStatus::Active => "active",
CapabilityStatus::Disabled => "disabled",
CapabilityStatus::Inactive => "inactive",
CapabilityStatus::Pending => "pending",
CapabilityStatus::Unrequested => "unrequested",
}
}
}
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)
}
}