use crate::config::{Client, Response};
use crate::ids::TokenId;
use crate::params::{Identifiable, Metadata, Timestamp};
use crate::resources::{AchCreditTransfer, Address, CardShort, Currency};
use serde_derive::{Deserialize, Serialize};
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct OwnerParams<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<&'a str>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct CodeVerification {
pub attempts_remaining: i64,
pub status: VerificationStatus,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum VerificationStatus {
Pending,
Succeeded,
Failed,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct VerifiedAddress {
pub city: Address,
pub country: String,
pub line1: String,
pub line2: String,
pub postal_code: String,
pub state: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Receiver {
pub address: String,
pub amount_charged: i64,
pub amount_received: i64,
pub amount_returned: i64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Redirect {
pub failure_reason: Option<String>,
pub return_url: String,
pub status: String,
pub url: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Owner {
pub address: Option<Address>,
pub email: Option<String>,
pub name: Option<String>,
pub phone: Option<String>,
pub verified_address: Option<VerifiedAddress>,
pub verified_email: Option<String>,
pub verified_name: Option<String>,
pub verified_phone: Option<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SourceType {
AchCreditTransfer,
AchDebit,
Alipay,
Bancontact,
Card,
CardPresent,
Eps,
Giropay,
Ideal,
Multibanco,
P24,
PaperCheck,
SepaCreditTransfer,
SepaDebit,
Sofort,
ThreeDSecure,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SourceStatus {
Canceled,
Chargeable,
Consumed,
Failed,
Pending,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SourceFlow {
Redirect,
Receiver,
CodeVerification,
None,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum SourceUsage {
Reusable,
SingleUse,
#[serde(other, skip_serializing)]
Other,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RedirectParams<'a> {
return_url: &'a str,
}
#[derive(Debug, Default, Deserialize, Serialize)]
pub struct SourceParams<'a> {
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub source_type: Option<SourceType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub amount: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<Currency>,
#[serde(skip_serializing_if = "Option::is_none")]
pub flow: Option<SourceFlow>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Metadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner: Option<OwnerParams<'a>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub statement_descriptor: Option<&'a str>,
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect: Option<RedirectParams<'a>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub token: Option<TokenId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub usage: Option<SourceUsage>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Source {
pub id: String,
pub ach_credit_transfer: Option<AchCreditTransfer>,
pub amount: Option<i64>,
pub card: Option<CardShort>,
pub client_secret: Option<String>,
pub code_verification: Option<CodeVerification>,
pub created: Timestamp,
pub currency: Option<Currency>,
pub flow: Option<SourceFlow>,
pub livemode: bool,
pub metadata: Option<Metadata>,
pub owner: Option<Owner>,
pub receiver: Option<Receiver>,
pub redirect: Option<Redirect>,
pub statement_descriptor: Option<String>,
pub status: Option<SourceStatus>,
#[serde(rename = "type")]
pub source_type: Option<SourceType>,
pub usage: Option<SourceUsage>,
}
impl Source {
pub fn create(client: &Client, params: SourceParams<'_>) -> Response<Source> {
client.post_form("/sources", params)
}
pub fn get(client: &Client, source_id: &str) -> Response<Source> {
client.get(&format!("/sources/{}", source_id))
}
pub fn update(client: &Client, source_id: &str, params: SourceParams<'_>) -> Response<Source> {
client.post_form(&format!("/source/{}", source_id), params)
}
}
impl Identifiable for Source {
fn id(&self) -> &str {
&self.id
}
}