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 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}