1use crate::client::{Client, Response};
6use crate::ids::{CustomerId, TokenId};
7use crate::params::{Expand, Metadata, Object, Timestamp};
8use crate::resources::{Address, BankAccount, Card, CompanyParams, PersonParams, TokenType};
9use serde::{Deserialize, Serialize};
10
11#[derive(Clone, Debug, Default, Deserialize, Serialize)]
15pub struct Token {
16 pub id: TokenId,
18
19 #[serde(skip_serializing_if = "Option::is_none")]
20 pub bank_account: Option<BankAccount>,
21
22 #[serde(skip_serializing_if = "Option::is_none")]
23 pub card: Option<Card>,
24
25 pub client_ip: Option<String>,
27
28 pub created: Timestamp,
32
33 pub livemode: bool,
35
36 #[serde(rename = "type")]
38 pub type_: TokenType,
39
40 pub used: bool,
42}
43
44impl Token {
45 pub fn create(client: &Client, params: CreateToken<'_>) -> Response<Token> {
51 #[allow(clippy::needless_borrows_for_generic_args)]
52 client.post_form("/tokens", ¶ms)
53 }
54
55 pub fn retrieve(client: &Client, id: &TokenId, expand: &[&str]) -> Response<Token> {
57 client.get_query(&format!("/tokens/{}", id), Expand { expand })
58 }
59}
60
61impl Object for Token {
62 type Id = TokenId;
63 fn id(&self) -> Self::Id {
64 self.id.clone()
65 }
66 fn object(&self) -> &'static str {
67 "token"
68 }
69}
70
71#[derive(Clone, Debug, Serialize, Default)]
73pub struct CreateToken<'a> {
74 #[serde(skip_serializing_if = "Option::is_none")]
76 pub account: Option<CreateTokenAccount>,
77
78 #[serde(skip_serializing_if = "Option::is_none")]
83 pub card: Option<CreateTokenCardUnion>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
90 pub customer: Option<CustomerId>,
91
92 #[serde(skip_serializing_if = "Option::is_none")]
94 pub cvc_update: Option<CreateTokenCvcUpdate>,
95
96 #[serde(skip_serializing_if = "Expand::is_empty")]
98 pub expand: &'a [&'a str],
99
100 #[serde(skip_serializing_if = "Option::is_none")]
102 pub person: Option<CreateTokenPerson>,
103
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub pii: Option<CreateTokenPii>,
107}
108
109impl<'a> CreateToken<'a> {
110 pub fn new() -> Self {
111 CreateToken {
112 account: Default::default(),
113 card: Default::default(),
114 customer: Default::default(),
115 cvc_update: Default::default(),
116 expand: Default::default(),
117 person: Default::default(),
118 pii: Default::default(),
119 }
120 }
121}
122
123#[derive(Clone, Debug, Default, Deserialize, Serialize)]
124pub struct CreateTokenAccount {
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub business_type: Option<CreateTokenAccountBusinessType>,
128
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub company: Option<CompanyParams>,
132
133 #[serde(skip_serializing_if = "Option::is_none")]
135 pub individual: Option<PersonParams>,
136
137 #[serde(skip_serializing_if = "Option::is_none")]
141 pub tos_shown_and_accepted: Option<bool>,
142}
143
144#[derive(Clone, Debug, Default, Deserialize, Serialize)]
145pub struct CreateTokenCvcUpdate {
146 pub cvc: String,
148}
149
150#[derive(Clone, Debug, Default, Deserialize, Serialize)]
151pub struct CreateTokenPerson {
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub additional_tos_acceptances: Option<CreateTokenPersonAdditionalTosAcceptances>,
155
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub address: Option<Address>,
159
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub address_kana: Option<Address>,
163
164 #[serde(skip_serializing_if = "Option::is_none")]
166 pub address_kanji: Option<Address>,
167
168 #[serde(skip_serializing_if = "Option::is_none")]
170 pub dob: Option<CreateTokenPersonDob>,
171
172 #[serde(skip_serializing_if = "Option::is_none")]
174 pub documents: Option<CreateTokenPersonDocuments>,
175
176 #[serde(skip_serializing_if = "Option::is_none")]
178 pub email: Option<String>,
179
180 #[serde(skip_serializing_if = "Option::is_none")]
182 pub first_name: Option<String>,
183
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub first_name_kana: Option<String>,
187
188 #[serde(skip_serializing_if = "Option::is_none")]
190 pub first_name_kanji: Option<String>,
191
192 #[serde(skip_serializing_if = "Option::is_none")]
194 pub full_name_aliases: Option<Vec<String>>,
195
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub gender: Option<String>,
199
200 #[serde(skip_serializing_if = "Option::is_none")]
205 pub id_number: Option<String>,
206
207 #[serde(skip_serializing_if = "Option::is_none")]
212 pub id_number_secondary: Option<String>,
213
214 #[serde(skip_serializing_if = "Option::is_none")]
216 pub last_name: Option<String>,
217
218 #[serde(skip_serializing_if = "Option::is_none")]
220 pub last_name_kana: Option<String>,
221
222 #[serde(skip_serializing_if = "Option::is_none")]
224 pub last_name_kanji: Option<String>,
225
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub maiden_name: Option<String>,
229
230 #[serde(skip_serializing_if = "Option::is_none")]
236 pub metadata: Option<Metadata>,
237
238 #[serde(skip_serializing_if = "Option::is_none")]
242 pub nationality: Option<String>,
243
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub phone: Option<String>,
247
248 #[serde(skip_serializing_if = "Option::is_none")]
250 pub political_exposure: Option<String>,
251
252 #[serde(skip_serializing_if = "Option::is_none")]
254 pub registered_address: Option<CreateTokenPersonRegisteredAddress>,
255
256 #[serde(skip_serializing_if = "Option::is_none")]
258 pub relationship: Option<CreateTokenPersonRelationship>,
259
260 #[serde(skip_serializing_if = "Option::is_none")]
264 pub ssn_last_4: Option<String>,
265
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub verification: Option<PersonVerificationParams>,
269}
270
271#[derive(Clone, Debug, Default, Deserialize, Serialize)]
272pub struct CreateTokenPii {
273 #[serde(skip_serializing_if = "Option::is_none")]
275 pub id_number: Option<String>,
276}
277
278#[derive(Clone, Debug, Default, Deserialize, Serialize)]
279pub struct CreateTokenPersonAdditionalTosAcceptances {
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub account: Option<CreateTokenPersonAdditionalTosAcceptancesAccount>,
283}
284
285#[derive(Clone, Debug, Default, Deserialize, Serialize)]
286pub struct CreateTokenPersonDob {
287 pub day: i64,
289
290 pub month: i64,
292
293 pub year: i64,
295}
296
297#[derive(Clone, Debug, Default, Deserialize, Serialize)]
298pub struct CreateTokenPersonDocuments {
299 #[serde(skip_serializing_if = "Option::is_none")]
301 pub company_authorization: Option<CreateTokenPersonDocumentsCompanyAuthorization>,
302
303 #[serde(skip_serializing_if = "Option::is_none")]
305 pub passport: Option<CreateTokenPersonDocumentsPassport>,
306
307 #[serde(skip_serializing_if = "Option::is_none")]
309 pub visa: Option<CreateTokenPersonDocumentsVisa>,
310}
311
312#[derive(Clone, Debug, Default, Deserialize, Serialize)]
313pub struct CreateTokenPersonRegisteredAddress {
314 #[serde(skip_serializing_if = "Option::is_none")]
316 pub city: Option<String>,
317
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub country: Option<String>,
321
322 #[serde(skip_serializing_if = "Option::is_none")]
324 pub line1: Option<String>,
325
326 #[serde(skip_serializing_if = "Option::is_none")]
328 pub line2: Option<String>,
329
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub postal_code: Option<String>,
333
334 #[serde(skip_serializing_if = "Option::is_none")]
336 pub state: Option<String>,
337}
338
339#[derive(Clone, Debug, Default, Deserialize, Serialize)]
340pub struct CreateTokenPersonRelationship {
341 #[serde(skip_serializing_if = "Option::is_none")]
345 pub director: Option<bool>,
346
347 #[serde(skip_serializing_if = "Option::is_none")]
349 pub executive: Option<bool>,
350
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub legal_guardian: Option<bool>,
354
355 #[serde(skip_serializing_if = "Option::is_none")]
357 pub owner: Option<bool>,
358
359 #[serde(skip_serializing_if = "Option::is_none")]
361 pub percent_ownership: Option<f64>,
362
363 #[serde(skip_serializing_if = "Option::is_none")]
369 pub representative: Option<bool>,
370
371 #[serde(skip_serializing_if = "Option::is_none")]
373 pub title: Option<String>,
374}
375
376#[derive(Clone, Debug, Default, Deserialize, Serialize)]
377pub struct PersonVerificationParams {
378 #[serde(skip_serializing_if = "Option::is_none")]
380 pub additional_document: Option<VerificationDocumentParams>,
381
382 #[serde(skip_serializing_if = "Option::is_none")]
384 pub document: Option<VerificationDocumentParams>,
385}
386
387#[derive(Clone, Debug, Default, Deserialize, Serialize)]
388pub struct CreateTokenPersonAdditionalTosAcceptancesAccount {
389 #[serde(skip_serializing_if = "Option::is_none")]
391 pub date: Option<Timestamp>,
392
393 #[serde(skip_serializing_if = "Option::is_none")]
395 pub ip: Option<String>,
396
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub user_agent: Option<String>,
400}
401
402#[derive(Clone, Debug, Default, Deserialize, Serialize)]
403pub struct CreateTokenPersonDocumentsCompanyAuthorization {
404 #[serde(skip_serializing_if = "Option::is_none")]
406 pub files: Option<Vec<String>>,
407}
408
409#[derive(Clone, Debug, Default, Deserialize, Serialize)]
410pub struct CreateTokenPersonDocumentsPassport {
411 #[serde(skip_serializing_if = "Option::is_none")]
413 pub files: Option<Vec<String>>,
414}
415
416#[derive(Clone, Debug, Default, Deserialize, Serialize)]
417pub struct CreateTokenPersonDocumentsVisa {
418 #[serde(skip_serializing_if = "Option::is_none")]
420 pub files: Option<Vec<String>>,
421}
422
423#[derive(Clone, Debug, Default, Deserialize, Serialize)]
424pub struct VerificationDocumentParams {
425 #[serde(skip_serializing_if = "Option::is_none")]
429 pub back: Option<String>,
430
431 #[serde(skip_serializing_if = "Option::is_none")]
435 pub front: Option<String>,
436}
437
438#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
440#[serde(rename_all = "snake_case")]
441pub enum CreateTokenAccountBusinessType {
442 Company,
443 GovernmentEntity,
444 Individual,
445 NonProfit,
446}
447
448impl CreateTokenAccountBusinessType {
449 pub fn as_str(self) -> &'static str {
450 match self {
451 CreateTokenAccountBusinessType::Company => "company",
452 CreateTokenAccountBusinessType::GovernmentEntity => "government_entity",
453 CreateTokenAccountBusinessType::Individual => "individual",
454 CreateTokenAccountBusinessType::NonProfit => "non_profit",
455 }
456 }
457}
458
459impl AsRef<str> for CreateTokenAccountBusinessType {
460 fn as_ref(&self) -> &str {
461 self.as_str()
462 }
463}
464
465impl std::fmt::Display for CreateTokenAccountBusinessType {
466 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
467 self.as_str().fmt(f)
468 }
469}
470impl std::default::Default for CreateTokenAccountBusinessType {
471 fn default() -> Self {
472 Self::Company
473 }
474}
475
476#[derive(Clone, Debug, Deserialize, Serialize)]
481#[serde(untagged, rename_all = "snake_case")]
482pub enum CreateTokenCardUnion {
483 CreditCardSpecs(CreditCardSpecs),
484 String(String),
485}
486
487#[derive(Clone, Debug, Default, Deserialize, Serialize)]
488pub struct CreditCardSpecs {
489 #[serde(skip_serializing_if = "Option::is_none")]
491 pub address_city: Option<String>,
492 #[serde(skip_serializing_if = "Option::is_none")]
494 pub address_country: Option<String>,
495 #[serde(skip_serializing_if = "Option::is_none")]
497 pub address_line1: Option<String>,
498 #[serde(skip_serializing_if = "Option::is_none")]
500 pub address_line2: Option<String>,
501 #[serde(skip_serializing_if = "Option::is_none")]
503 pub address_state: Option<String>,
504 #[serde(skip_serializing_if = "Option::is_none")]
506 pub address_zip: Option<String>,
507 #[serde(skip_serializing_if = "Option::is_none")]
511 pub currency: Option<String>,
512 #[serde(skip_serializing_if = "Option::is_none")]
516 pub cvc: Option<String>,
517 pub exp_month: String,
519 pub exp_year: String,
521 #[serde(skip_serializing_if = "Option::is_none")]
523 pub name: Option<String>,
524 pub number: String,
526}