stripe_api/resources/paymentmethods/
source.rs

1use crate::resources::common::address::Address;
2use crate::resources::common::currency::Currency;
3use crate::resources::common::object::Object;
4
5use crate::resources::common::path::UrlPath;
6use crate::resources::core::refunds::FailureReason;
7use crate::resources::paymentmethods::bank::{BankAccount, BankAccountParam};
8use crate::resources::paymentmethods::cards::{Card, CardParam};
9use crate::{Client};
10use std::collections::HashMap;
11
12#[derive(Serialize, Deserialize, Debug, PartialEq)]
13pub struct Source {
14    pub id: String,
15    pub object: Object,
16    pub ach_credit_transfer: Option<AchCreditTransfer>,
17    pub amount: Option<i32>,
18    pub client_secret: String,
19    pub code_verification: Option<CodeVerification>,
20    pub created: i64,
21    pub currency: Currency,
22    pub customer: Option<String>,
23    pub flow: SourceFlow,
24    pub livemode: bool,
25    pub metadata: HashMap<String, String>,
26    pub owner: SourceOwner,
27    pub receiver: Option<SourceReceiver>,
28    pub redirect: Option<SourceRedirect>,
29    pub statement_descriptor: Option<String>,
30    pub status: SourceStatus,
31    #[serde(rename = "type")]
32    pub source_type: SourceType,
33    pub usage: SourceUsage,
34}
35
36#[derive(Serialize, Deserialize, Debug, PartialEq)]
37pub struct AchCreditTransfer {
38    pub account_number: String,
39    pub routing_number: String,
40    pub fingerprint: String,
41    pub bank_name: String,
42    pub swift_code: String,
43}
44
45#[derive(Serialize, Deserialize, Debug, PartialEq)]
46pub struct CodeVerification {
47    pub attempts_remaining: i64,
48    pub status: VerificationStatus,
49}
50
51#[derive(Serialize, Deserialize, Debug, PartialEq)]
52#[serde(rename_all = "lowercase")]
53pub enum VerificationStatus {
54    Pending,
55    Succeeded,
56    Failed,
57}
58
59#[derive(Serialize, Deserialize, Debug, PartialEq)]
60pub struct SourceRedirect {
61    pub failure_reason: FailureReason,
62    pub return_url: String,
63    pub status: SourceRedirectStatus,
64    pub url: String,
65}
66
67#[derive(Serialize, Deserialize, Debug, PartialEq)]
68#[serde(rename_all = "snake_case")]
69pub enum RedirectFailureReason {
70    UserAbort,
71    Declined,
72    ProcessingError,
73}
74
75#[derive(Serialize, Deserialize, Debug, PartialEq)]
76#[serde(rename_all = "snake_case")]
77pub enum SourceRedirectStatus {
78    Pending,
79    Succeeded,
80    NotRequired,
81    Failed,
82}
83
84#[derive(Serialize, Deserialize, Debug, PartialEq)]
85pub struct SourceOwner {
86    pub address: Option<Address>,
87    pub email: Option<String>,
88    pub name: Option<String>,
89    pub phone: Option<String>,
90    pub verified_address: Option<Address>,
91    pub verified_email: Option<String>,
92    pub verified_name: Option<String>,
93    pub verified_phone: Option<String>,
94}
95
96#[derive(Serialize, Deserialize, Debug, PartialEq)]
97pub struct SourceReceiver {
98    pub address: String,
99    pub amount_charged: i32,
100    pub amount_received: i32,
101    pub amount_returned: i32,
102    pub refund_attributes_method: String,
103    pub refund_attributes_status: String,
104}
105
106#[derive(Serialize, Deserialize, Debug, PartialEq)]
107#[serde(rename_all = "snake_case")]
108pub enum SourceFlow {
109    Redirect,
110    Receiver,
111    CodeVerification,
112    None,
113}
114
115#[derive(Serialize, Deserialize, Debug, PartialEq)]
116#[serde(rename_all = "snake_case")]
117pub enum SourceUsage {
118    Reusable,
119    SingleUse,
120}
121
122#[derive(Serialize, Deserialize, Debug, PartialEq)]
123#[serde(rename_all = "lowercase")]
124pub enum SourceStatus {
125    Canceled,
126    Chargeable,
127    Consumed,
128    Failed,
129    Pending,
130}
131
132#[derive(Serialize, Deserialize, Debug, PartialEq)]
133#[serde(rename_all = "snake_case")]
134pub enum SourceType {
135    AchCreditTransfer,
136    AchDebit,
137    Alypay,
138    Bancontact,
139    Card,
140    CardPresent,
141    Eps,
142    Giopay,
143    Ideal,
144    Multibanco,
145    P24,
146    PaperCheck,
147    SepaCreditTransfer,
148    SepaDebit,
149    Sofort,
150    ThreeDSecure,
151    Wechat,
152}
153
154#[derive(Serialize, Deserialize, Debug, PartialEq)]
155#[serde(untagged)]
156pub enum PaymentSource {
157    BankAccount(BankAccount),
158    Card(Card),
159}
160
161#[derive(Serialize, Debug, PartialEq)]
162#[serde(untagged)]
163pub enum PaymentSourceParam<'a> {
164    BankAccount(BankAccountParam<'a>),
165    Card(CardParam<'a>),
166    Token(&'a str),
167}
168
169#[derive(Default, Serialize, Debug, PartialEq)]
170pub struct PaymentParam<'a> {
171    #[serde(skip_serializing_if = "Option::is_none")]
172    pub source: Option<PaymentSourceParam<'a>>,
173    #[serde(skip_serializing_if = "Option::is_none")]
174    pub metadata: Option<HashMap<String, String>>,
175}
176
177#[derive(Default, Serialize, Debug, PartialEq)]
178pub struct SourceParam<'a> {
179    #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
180    pub source_type: Option<SourceType>,
181    #[serde(skip_serializing_if = "Option::is_none")]
182    pub amount: Option<i32>,
183    #[serde(skip_serializing_if = "Option::is_none")]
184    pub currency: Option<Currency>,
185    #[serde(skip_serializing_if = "Option::is_none")]
186    pub flow: Option<SourceFlow>,
187    #[serde(skip_serializing_if = "Option::is_none")]
188    pub metadata: Option<HashMap<&'a str, &'a str>>,
189    #[serde(skip_serializing_if = "Option::is_none")]
190    pub owner: Option<SourceOwner>,
191    #[serde(skip_serializing_if = "Option::is_none")]
192    pub redirect: Option<SourceRedirectParam<'a>>,
193    #[serde(skip_serializing_if = "Option::is_none")]
194    pub statement_descriptor: Option<&'a str>,
195    #[serde(skip_serializing_if = "Option::is_none")]
196    pub token: Option<&'a str>,
197    #[serde(skip_serializing_if = "Option::is_none")]
198    pub client_secret: Option<&'a str>,
199    #[serde(skip_serializing_if = "Option::is_none")]
200    pub usage: Option<SourceUsage>,
201}
202
203#[derive(Default, Serialize, Debug, PartialEq)]
204pub struct SourceRedirectParam<'a> {
205    #[serde(skip_serializing_if = "Option::is_none")]
206    pub return_url: Option<&'a str>,
207}
208
209impl Source {
210    pub fn create<B: serde::Serialize>(client: &Client, param: B) -> crate::Result<Self> {
211        client.post(UrlPath::Sources, vec![], param)
212    }
213
214    pub fn retrieve<B: serde::Serialize>(
215        client: &Client,
216        id: &str,
217        param: B,
218    ) -> crate::Result<Self> {
219        client.get(UrlPath::Sources, vec![id], param)
220    }
221
222    pub fn update<B: serde::Serialize>(client: &Client, id: &str, param: B) -> crate::Result<Self> {
223        client.post(UrlPath::Sources, vec![id], param)
224    }
225
226    //TODO: Review documents
227    pub fn attach<B: serde::Serialize>(client: &Client, id: &str, param: B) -> crate::Result<Self> {
228        client.post(UrlPath::Customers, vec![id, "sources"], param)
229    }
230
231    pub fn detach<B: serde::Serialize>(client: &Client, id: &str, param: B) -> crate::Result<Self> {
232        client.post(UrlPath::Customers, vec![id, "sources"], param)
233    }
234}