stripe_shared/
card.rs

1/// You can store multiple cards on a customer in order to charge the customer
2/// later. You can also store multiple debit cards on a recipient in order to
3/// transfer to those cards later.
4///
5/// Related guide: [Card payments with Sources](https://stripe.com/docs/sources/cards)
6///
7/// For more details see <<https://stripe.com/docs/api/cards/object>>.
8#[derive(Clone, Debug)]
9#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
10pub struct Card {
11    pub account: Option<stripe_types::Expandable<stripe_shared::Account>>,
12    /// City/District/Suburb/Town/Village.
13    pub address_city: Option<String>,
14    /// Billing address country, if provided when creating card.
15    pub address_country: Option<String>,
16    /// Address line 1 (Street address/PO Box/Company name).
17    pub address_line1: Option<String>,
18    /// If `address_line1` was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`.
19    pub address_line1_check: Option<String>,
20    /// Address line 2 (Apartment/Suite/Unit/Building).
21    pub address_line2: Option<String>,
22    /// State/County/Province/Region.
23    pub address_state: Option<String>,
24    /// ZIP or postal code.
25    pub address_zip: Option<String>,
26    /// If `address_zip` was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`.
27    pub address_zip_check: Option<String>,
28    /// This field indicates whether this payment method can be shown again to its customer in a checkout flow.
29    /// Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow.
30    /// The field defaults to “unspecified”.
31    pub allow_redisplay: Option<CardAllowRedisplay>,
32    /// A set of available payout methods for this card.
33    /// Only values from this set should be passed as the `method` when creating a payout.
34    pub available_payout_methods: Option<Vec<CardAvailablePayoutMethods>>,
35    /// Card brand.
36    /// Can be `American Express`, `Diners Club`, `Discover`, `Eftpos Australia`, `Girocard`, `JCB`, `MasterCard`, `UnionPay`, `Visa`, or `Unknown`.
37    pub brand: String,
38    /// Two-letter ISO code representing the country of the card.
39    /// You could use this attribute to get a sense of the international breakdown of cards you've collected.
40    pub country: Option<String>,
41    /// Three-letter [ISO code for currency](https://www.iso.org/iso-4217-currency-codes.html) in lowercase.
42    /// Must be a [supported currency](https://docs.stripe.com/currencies).
43    /// Only applicable on accounts (not customers or recipients).
44    /// The card can be used as a transfer destination for funds in this currency.
45    /// This property is only available when returned as an [External Account](/api/external_account_cards/object) where [controller.is_controller](/api/accounts/object#account_object-controller-is_controller) is `true`.
46    pub currency: Option<stripe_types::Currency>,
47    /// The customer that this card belongs to.
48    /// This attribute will not be in the card object if the card belongs to an account or recipient instead.
49    pub customer: Option<stripe_types::Expandable<stripe_shared::Customer>>,
50    /// If a CVC was provided, results of the check: `pass`, `fail`, `unavailable`, or `unchecked`.
51    /// A result of unchecked indicates that CVC was provided but hasn't been checked yet.
52    /// Checks are typically performed when attaching a card to a Customer object, or when creating a charge.
53    /// For more details, see [Check if a card is valid without a charge](https://support.stripe.com/questions/check-if-a-card-is-valid-without-a-charge).
54    pub cvc_check: Option<String>,
55    /// Whether this card is the default external account for its currency.
56    /// This property is only available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `application`, which includes Custom accounts.
57    pub default_for_currency: Option<bool>,
58    /// A high-level description of the type of cards issued in this range.
59    /// (For internal use only and not typically available in standard API requests.).
60    pub description: Option<String>,
61    /// (For tokenized numbers only.) The last four digits of the device account number.
62    pub dynamic_last4: Option<String>,
63    /// Two-digit number representing the card's expiration month.
64    pub exp_month: i64,
65    /// Four-digit number representing the card's expiration year.
66    pub exp_year: i64,
67    /// Uniquely identifies this particular card number.
68    /// You can use this attribute to check whether two customers who’ve signed up with you are using the same card number, for example.
69    /// For payment methods that tokenize card information (Apple Pay, Google Pay), the tokenized number might be provided instead of the underlying card number.
70    ///
71    /// *As of May 1, 2021, card fingerprint in India for Connect changed to allow two fingerprints for the same card---one for India and one for the rest of the world.*.
72    pub fingerprint: Option<String>,
73    /// Card funding type. Can be `credit`, `debit`, `prepaid`, or `unknown`.
74    pub funding: String,
75    /// Unique identifier for the object.
76    pub id: stripe_shared::CardId,
77    /// Issuer identification number of the card.
78    /// (For internal use only and not typically available in standard API requests.).
79    pub iin: Option<String>,
80    /// The name of the card's issuing bank.
81    /// (For internal use only and not typically available in standard API requests.).
82    pub issuer: Option<String>,
83    /// The last four digits of the card.
84    pub last4: String,
85    /// Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object.
86    /// This can be useful for storing additional information about the object in a structured format.
87    pub metadata: Option<std::collections::HashMap<String, String>>,
88    /// Cardholder name.
89    pub name: Option<String>,
90    pub networks: Option<stripe_shared::TokenCardNetworks>,
91    /// Status of a card based on the card issuer.
92    pub regulated_status: Option<CardRegulatedStatus>,
93    /// For external accounts that are cards, possible values are `new` and `errored`.
94    /// If a payout fails, the status is set to `errored` and [scheduled payouts](https://stripe.com/docs/payouts#payout-schedule) are stopped until account details are updated.
95    pub status: Option<String>,
96    /// If the card number is tokenized, this is the method that was used.
97    /// Can be `android_pay` (includes Google Pay), `apple_pay`, `masterpass`, `visa_checkout`, or null.
98    pub tokenization_method: Option<String>,
99}
100#[doc(hidden)]
101pub struct CardBuilder {
102    account: Option<Option<stripe_types::Expandable<stripe_shared::Account>>>,
103    address_city: Option<Option<String>>,
104    address_country: Option<Option<String>>,
105    address_line1: Option<Option<String>>,
106    address_line1_check: Option<Option<String>>,
107    address_line2: Option<Option<String>>,
108    address_state: Option<Option<String>>,
109    address_zip: Option<Option<String>>,
110    address_zip_check: Option<Option<String>>,
111    allow_redisplay: Option<Option<CardAllowRedisplay>>,
112    available_payout_methods: Option<Option<Vec<CardAvailablePayoutMethods>>>,
113    brand: Option<String>,
114    country: Option<Option<String>>,
115    currency: Option<Option<stripe_types::Currency>>,
116    customer: Option<Option<stripe_types::Expandable<stripe_shared::Customer>>>,
117    cvc_check: Option<Option<String>>,
118    default_for_currency: Option<Option<bool>>,
119    description: Option<Option<String>>,
120    dynamic_last4: Option<Option<String>>,
121    exp_month: Option<i64>,
122    exp_year: Option<i64>,
123    fingerprint: Option<Option<String>>,
124    funding: Option<String>,
125    id: Option<stripe_shared::CardId>,
126    iin: Option<Option<String>>,
127    issuer: Option<Option<String>>,
128    last4: Option<String>,
129    metadata: Option<Option<std::collections::HashMap<String, String>>>,
130    name: Option<Option<String>>,
131    networks: Option<Option<stripe_shared::TokenCardNetworks>>,
132    regulated_status: Option<Option<CardRegulatedStatus>>,
133    status: Option<Option<String>>,
134    tokenization_method: Option<Option<String>>,
135}
136
137#[allow(
138    unused_variables,
139    irrefutable_let_patterns,
140    clippy::let_unit_value,
141    clippy::match_single_binding,
142    clippy::single_match
143)]
144const _: () = {
145    use miniserde::de::{Map, Visitor};
146    use miniserde::json::Value;
147    use miniserde::{make_place, Deserialize, Result};
148    use stripe_types::miniserde_helpers::FromValueOpt;
149    use stripe_types::{MapBuilder, ObjectDeser};
150
151    make_place!(Place);
152
153    impl Deserialize for Card {
154        fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
155            Place::new(out)
156        }
157    }
158
159    struct Builder<'a> {
160        out: &'a mut Option<Card>,
161        builder: CardBuilder,
162    }
163
164    impl Visitor for Place<Card> {
165        fn map(&mut self) -> Result<Box<dyn Map + '_>> {
166            Ok(Box::new(Builder { out: &mut self.out, builder: CardBuilder::deser_default() }))
167        }
168    }
169
170    impl MapBuilder for CardBuilder {
171        type Out = Card;
172        fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
173            Ok(match k {
174                "account" => Deserialize::begin(&mut self.account),
175                "address_city" => Deserialize::begin(&mut self.address_city),
176                "address_country" => Deserialize::begin(&mut self.address_country),
177                "address_line1" => Deserialize::begin(&mut self.address_line1),
178                "address_line1_check" => Deserialize::begin(&mut self.address_line1_check),
179                "address_line2" => Deserialize::begin(&mut self.address_line2),
180                "address_state" => Deserialize::begin(&mut self.address_state),
181                "address_zip" => Deserialize::begin(&mut self.address_zip),
182                "address_zip_check" => Deserialize::begin(&mut self.address_zip_check),
183                "allow_redisplay" => Deserialize::begin(&mut self.allow_redisplay),
184                "available_payout_methods" => {
185                    Deserialize::begin(&mut self.available_payout_methods)
186                }
187                "brand" => Deserialize::begin(&mut self.brand),
188                "country" => Deserialize::begin(&mut self.country),
189                "currency" => Deserialize::begin(&mut self.currency),
190                "customer" => Deserialize::begin(&mut self.customer),
191                "cvc_check" => Deserialize::begin(&mut self.cvc_check),
192                "default_for_currency" => Deserialize::begin(&mut self.default_for_currency),
193                "description" => Deserialize::begin(&mut self.description),
194                "dynamic_last4" => Deserialize::begin(&mut self.dynamic_last4),
195                "exp_month" => Deserialize::begin(&mut self.exp_month),
196                "exp_year" => Deserialize::begin(&mut self.exp_year),
197                "fingerprint" => Deserialize::begin(&mut self.fingerprint),
198                "funding" => Deserialize::begin(&mut self.funding),
199                "id" => Deserialize::begin(&mut self.id),
200                "iin" => Deserialize::begin(&mut self.iin),
201                "issuer" => Deserialize::begin(&mut self.issuer),
202                "last4" => Deserialize::begin(&mut self.last4),
203                "metadata" => Deserialize::begin(&mut self.metadata),
204                "name" => Deserialize::begin(&mut self.name),
205                "networks" => Deserialize::begin(&mut self.networks),
206                "regulated_status" => Deserialize::begin(&mut self.regulated_status),
207                "status" => Deserialize::begin(&mut self.status),
208                "tokenization_method" => Deserialize::begin(&mut self.tokenization_method),
209
210                _ => <dyn Visitor>::ignore(),
211            })
212        }
213
214        fn deser_default() -> Self {
215            Self {
216                account: Deserialize::default(),
217                address_city: Deserialize::default(),
218                address_country: Deserialize::default(),
219                address_line1: Deserialize::default(),
220                address_line1_check: Deserialize::default(),
221                address_line2: Deserialize::default(),
222                address_state: Deserialize::default(),
223                address_zip: Deserialize::default(),
224                address_zip_check: Deserialize::default(),
225                allow_redisplay: Deserialize::default(),
226                available_payout_methods: Deserialize::default(),
227                brand: Deserialize::default(),
228                country: Deserialize::default(),
229                currency: Deserialize::default(),
230                customer: Deserialize::default(),
231                cvc_check: Deserialize::default(),
232                default_for_currency: Deserialize::default(),
233                description: Deserialize::default(),
234                dynamic_last4: Deserialize::default(),
235                exp_month: Deserialize::default(),
236                exp_year: Deserialize::default(),
237                fingerprint: Deserialize::default(),
238                funding: Deserialize::default(),
239                id: Deserialize::default(),
240                iin: Deserialize::default(),
241                issuer: Deserialize::default(),
242                last4: Deserialize::default(),
243                metadata: Deserialize::default(),
244                name: Deserialize::default(),
245                networks: Deserialize::default(),
246                regulated_status: Deserialize::default(),
247                status: Deserialize::default(),
248                tokenization_method: Deserialize::default(),
249            }
250        }
251
252        fn take_out(&mut self) -> Option<Self::Out> {
253            let (
254                Some(account),
255                Some(address_city),
256                Some(address_country),
257                Some(address_line1),
258                Some(address_line1_check),
259                Some(address_line2),
260                Some(address_state),
261                Some(address_zip),
262                Some(address_zip_check),
263                Some(allow_redisplay),
264                Some(available_payout_methods),
265                Some(brand),
266                Some(country),
267                Some(currency),
268                Some(customer),
269                Some(cvc_check),
270                Some(default_for_currency),
271                Some(description),
272                Some(dynamic_last4),
273                Some(exp_month),
274                Some(exp_year),
275                Some(fingerprint),
276                Some(funding),
277                Some(id),
278                Some(iin),
279                Some(issuer),
280                Some(last4),
281                Some(metadata),
282                Some(name),
283                Some(networks),
284                Some(regulated_status),
285                Some(status),
286                Some(tokenization_method),
287            ) = (
288                self.account.take(),
289                self.address_city.take(),
290                self.address_country.take(),
291                self.address_line1.take(),
292                self.address_line1_check.take(),
293                self.address_line2.take(),
294                self.address_state.take(),
295                self.address_zip.take(),
296                self.address_zip_check.take(),
297                self.allow_redisplay,
298                self.available_payout_methods.take(),
299                self.brand.take(),
300                self.country.take(),
301                self.currency,
302                self.customer.take(),
303                self.cvc_check.take(),
304                self.default_for_currency,
305                self.description.take(),
306                self.dynamic_last4.take(),
307                self.exp_month,
308                self.exp_year,
309                self.fingerprint.take(),
310                self.funding.take(),
311                self.id.take(),
312                self.iin.take(),
313                self.issuer.take(),
314                self.last4.take(),
315                self.metadata.take(),
316                self.name.take(),
317                self.networks.take(),
318                self.regulated_status,
319                self.status.take(),
320                self.tokenization_method.take(),
321            )
322            else {
323                return None;
324            };
325            Some(Self::Out {
326                account,
327                address_city,
328                address_country,
329                address_line1,
330                address_line1_check,
331                address_line2,
332                address_state,
333                address_zip,
334                address_zip_check,
335                allow_redisplay,
336                available_payout_methods,
337                brand,
338                country,
339                currency,
340                customer,
341                cvc_check,
342                default_for_currency,
343                description,
344                dynamic_last4,
345                exp_month,
346                exp_year,
347                fingerprint,
348                funding,
349                id,
350                iin,
351                issuer,
352                last4,
353                metadata,
354                name,
355                networks,
356                regulated_status,
357                status,
358                tokenization_method,
359            })
360        }
361    }
362
363    impl<'a> Map for Builder<'a> {
364        fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
365            self.builder.key(k)
366        }
367
368        fn finish(&mut self) -> Result<()> {
369            *self.out = self.builder.take_out();
370            Ok(())
371        }
372    }
373
374    impl ObjectDeser for Card {
375        type Builder = CardBuilder;
376    }
377
378    impl FromValueOpt for Card {
379        fn from_value(v: Value) -> Option<Self> {
380            let Value::Object(obj) = v else {
381                return None;
382            };
383            let mut b = CardBuilder::deser_default();
384            for (k, v) in obj {
385                match k.as_str() {
386                    "account" => b.account = FromValueOpt::from_value(v),
387                    "address_city" => b.address_city = FromValueOpt::from_value(v),
388                    "address_country" => b.address_country = FromValueOpt::from_value(v),
389                    "address_line1" => b.address_line1 = FromValueOpt::from_value(v),
390                    "address_line1_check" => b.address_line1_check = FromValueOpt::from_value(v),
391                    "address_line2" => b.address_line2 = FromValueOpt::from_value(v),
392                    "address_state" => b.address_state = FromValueOpt::from_value(v),
393                    "address_zip" => b.address_zip = FromValueOpt::from_value(v),
394                    "address_zip_check" => b.address_zip_check = FromValueOpt::from_value(v),
395                    "allow_redisplay" => b.allow_redisplay = FromValueOpt::from_value(v),
396                    "available_payout_methods" => {
397                        b.available_payout_methods = FromValueOpt::from_value(v)
398                    }
399                    "brand" => b.brand = FromValueOpt::from_value(v),
400                    "country" => b.country = FromValueOpt::from_value(v),
401                    "currency" => b.currency = FromValueOpt::from_value(v),
402                    "customer" => b.customer = FromValueOpt::from_value(v),
403                    "cvc_check" => b.cvc_check = FromValueOpt::from_value(v),
404                    "default_for_currency" => b.default_for_currency = FromValueOpt::from_value(v),
405                    "description" => b.description = FromValueOpt::from_value(v),
406                    "dynamic_last4" => b.dynamic_last4 = FromValueOpt::from_value(v),
407                    "exp_month" => b.exp_month = FromValueOpt::from_value(v),
408                    "exp_year" => b.exp_year = FromValueOpt::from_value(v),
409                    "fingerprint" => b.fingerprint = FromValueOpt::from_value(v),
410                    "funding" => b.funding = FromValueOpt::from_value(v),
411                    "id" => b.id = FromValueOpt::from_value(v),
412                    "iin" => b.iin = FromValueOpt::from_value(v),
413                    "issuer" => b.issuer = FromValueOpt::from_value(v),
414                    "last4" => b.last4 = FromValueOpt::from_value(v),
415                    "metadata" => b.metadata = FromValueOpt::from_value(v),
416                    "name" => b.name = FromValueOpt::from_value(v),
417                    "networks" => b.networks = FromValueOpt::from_value(v),
418                    "regulated_status" => b.regulated_status = FromValueOpt::from_value(v),
419                    "status" => b.status = FromValueOpt::from_value(v),
420                    "tokenization_method" => b.tokenization_method = FromValueOpt::from_value(v),
421
422                    _ => {}
423                }
424            }
425            b.take_out()
426        }
427    }
428};
429#[cfg(feature = "serialize")]
430impl serde::Serialize for Card {
431    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
432        use serde::ser::SerializeStruct;
433        let mut s = s.serialize_struct("Card", 34)?;
434        s.serialize_field("account", &self.account)?;
435        s.serialize_field("address_city", &self.address_city)?;
436        s.serialize_field("address_country", &self.address_country)?;
437        s.serialize_field("address_line1", &self.address_line1)?;
438        s.serialize_field("address_line1_check", &self.address_line1_check)?;
439        s.serialize_field("address_line2", &self.address_line2)?;
440        s.serialize_field("address_state", &self.address_state)?;
441        s.serialize_field("address_zip", &self.address_zip)?;
442        s.serialize_field("address_zip_check", &self.address_zip_check)?;
443        s.serialize_field("allow_redisplay", &self.allow_redisplay)?;
444        s.serialize_field("available_payout_methods", &self.available_payout_methods)?;
445        s.serialize_field("brand", &self.brand)?;
446        s.serialize_field("country", &self.country)?;
447        s.serialize_field("currency", &self.currency)?;
448        s.serialize_field("customer", &self.customer)?;
449        s.serialize_field("cvc_check", &self.cvc_check)?;
450        s.serialize_field("default_for_currency", &self.default_for_currency)?;
451        s.serialize_field("description", &self.description)?;
452        s.serialize_field("dynamic_last4", &self.dynamic_last4)?;
453        s.serialize_field("exp_month", &self.exp_month)?;
454        s.serialize_field("exp_year", &self.exp_year)?;
455        s.serialize_field("fingerprint", &self.fingerprint)?;
456        s.serialize_field("funding", &self.funding)?;
457        s.serialize_field("id", &self.id)?;
458        s.serialize_field("iin", &self.iin)?;
459        s.serialize_field("issuer", &self.issuer)?;
460        s.serialize_field("last4", &self.last4)?;
461        s.serialize_field("metadata", &self.metadata)?;
462        s.serialize_field("name", &self.name)?;
463        s.serialize_field("networks", &self.networks)?;
464        s.serialize_field("regulated_status", &self.regulated_status)?;
465        s.serialize_field("status", &self.status)?;
466        s.serialize_field("tokenization_method", &self.tokenization_method)?;
467
468        s.serialize_field("object", "card")?;
469        s.end()
470    }
471}
472/// This field indicates whether this payment method can be shown again to its customer in a checkout flow.
473/// Stripe products such as Checkout and Elements use this field to determine whether a payment method can be shown as a saved payment method in a checkout flow.
474/// The field defaults to “unspecified”.
475#[derive(Copy, Clone, Eq, PartialEq)]
476pub enum CardAllowRedisplay {
477    Always,
478    Limited,
479    Unspecified,
480}
481impl CardAllowRedisplay {
482    pub fn as_str(self) -> &'static str {
483        use CardAllowRedisplay::*;
484        match self {
485            Always => "always",
486            Limited => "limited",
487            Unspecified => "unspecified",
488        }
489    }
490}
491
492impl std::str::FromStr for CardAllowRedisplay {
493    type Err = stripe_types::StripeParseError;
494    fn from_str(s: &str) -> Result<Self, Self::Err> {
495        use CardAllowRedisplay::*;
496        match s {
497            "always" => Ok(Always),
498            "limited" => Ok(Limited),
499            "unspecified" => Ok(Unspecified),
500            _ => Err(stripe_types::StripeParseError),
501        }
502    }
503}
504impl std::fmt::Display for CardAllowRedisplay {
505    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
506        f.write_str(self.as_str())
507    }
508}
509
510impl std::fmt::Debug for CardAllowRedisplay {
511    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
512        f.write_str(self.as_str())
513    }
514}
515#[cfg(feature = "serialize")]
516impl serde::Serialize for CardAllowRedisplay {
517    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
518    where
519        S: serde::Serializer,
520    {
521        serializer.serialize_str(self.as_str())
522    }
523}
524impl miniserde::Deserialize for CardAllowRedisplay {
525    fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
526        crate::Place::new(out)
527    }
528}
529
530impl miniserde::de::Visitor for crate::Place<CardAllowRedisplay> {
531    fn string(&mut self, s: &str) -> miniserde::Result<()> {
532        use std::str::FromStr;
533        self.out = Some(CardAllowRedisplay::from_str(s).map_err(|_| miniserde::Error)?);
534        Ok(())
535    }
536}
537
538stripe_types::impl_from_val_with_from_str!(CardAllowRedisplay);
539#[cfg(feature = "deserialize")]
540impl<'de> serde::Deserialize<'de> for CardAllowRedisplay {
541    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
542        use std::str::FromStr;
543        let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
544        Self::from_str(&s)
545            .map_err(|_| serde::de::Error::custom("Unknown value for CardAllowRedisplay"))
546    }
547}
548/// A set of available payout methods for this card.
549/// Only values from this set should be passed as the `method` when creating a payout.
550#[derive(Copy, Clone, Eq, PartialEq)]
551pub enum CardAvailablePayoutMethods {
552    Instant,
553    Standard,
554}
555impl CardAvailablePayoutMethods {
556    pub fn as_str(self) -> &'static str {
557        use CardAvailablePayoutMethods::*;
558        match self {
559            Instant => "instant",
560            Standard => "standard",
561        }
562    }
563}
564
565impl std::str::FromStr for CardAvailablePayoutMethods {
566    type Err = stripe_types::StripeParseError;
567    fn from_str(s: &str) -> Result<Self, Self::Err> {
568        use CardAvailablePayoutMethods::*;
569        match s {
570            "instant" => Ok(Instant),
571            "standard" => Ok(Standard),
572            _ => Err(stripe_types::StripeParseError),
573        }
574    }
575}
576impl std::fmt::Display for CardAvailablePayoutMethods {
577    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
578        f.write_str(self.as_str())
579    }
580}
581
582impl std::fmt::Debug for CardAvailablePayoutMethods {
583    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
584        f.write_str(self.as_str())
585    }
586}
587#[cfg(feature = "serialize")]
588impl serde::Serialize for CardAvailablePayoutMethods {
589    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
590    where
591        S: serde::Serializer,
592    {
593        serializer.serialize_str(self.as_str())
594    }
595}
596impl miniserde::Deserialize for CardAvailablePayoutMethods {
597    fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
598        crate::Place::new(out)
599    }
600}
601
602impl miniserde::de::Visitor for crate::Place<CardAvailablePayoutMethods> {
603    fn string(&mut self, s: &str) -> miniserde::Result<()> {
604        use std::str::FromStr;
605        self.out = Some(CardAvailablePayoutMethods::from_str(s).map_err(|_| miniserde::Error)?);
606        Ok(())
607    }
608}
609
610stripe_types::impl_from_val_with_from_str!(CardAvailablePayoutMethods);
611#[cfg(feature = "deserialize")]
612impl<'de> serde::Deserialize<'de> for CardAvailablePayoutMethods {
613    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
614        use std::str::FromStr;
615        let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
616        Self::from_str(&s)
617            .map_err(|_| serde::de::Error::custom("Unknown value for CardAvailablePayoutMethods"))
618    }
619}
620/// Status of a card based on the card issuer.
621#[derive(Copy, Clone, Eq, PartialEq)]
622pub enum CardRegulatedStatus {
623    Regulated,
624    Unregulated,
625}
626impl CardRegulatedStatus {
627    pub fn as_str(self) -> &'static str {
628        use CardRegulatedStatus::*;
629        match self {
630            Regulated => "regulated",
631            Unregulated => "unregulated",
632        }
633    }
634}
635
636impl std::str::FromStr for CardRegulatedStatus {
637    type Err = stripe_types::StripeParseError;
638    fn from_str(s: &str) -> Result<Self, Self::Err> {
639        use CardRegulatedStatus::*;
640        match s {
641            "regulated" => Ok(Regulated),
642            "unregulated" => Ok(Unregulated),
643            _ => Err(stripe_types::StripeParseError),
644        }
645    }
646}
647impl std::fmt::Display for CardRegulatedStatus {
648    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
649        f.write_str(self.as_str())
650    }
651}
652
653impl std::fmt::Debug for CardRegulatedStatus {
654    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
655        f.write_str(self.as_str())
656    }
657}
658#[cfg(feature = "serialize")]
659impl serde::Serialize for CardRegulatedStatus {
660    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
661    where
662        S: serde::Serializer,
663    {
664        serializer.serialize_str(self.as_str())
665    }
666}
667impl miniserde::Deserialize for CardRegulatedStatus {
668    fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
669        crate::Place::new(out)
670    }
671}
672
673impl miniserde::de::Visitor for crate::Place<CardRegulatedStatus> {
674    fn string(&mut self, s: &str) -> miniserde::Result<()> {
675        use std::str::FromStr;
676        self.out = Some(CardRegulatedStatus::from_str(s).map_err(|_| miniserde::Error)?);
677        Ok(())
678    }
679}
680
681stripe_types::impl_from_val_with_from_str!(CardRegulatedStatus);
682#[cfg(feature = "deserialize")]
683impl<'de> serde::Deserialize<'de> for CardRegulatedStatus {
684    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
685        use std::str::FromStr;
686        let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
687        Self::from_str(&s)
688            .map_err(|_| serde::de::Error::custom("Unknown value for CardRegulatedStatus"))
689    }
690}
691impl stripe_types::Object for Card {
692    type Id = stripe_shared::CardId;
693    fn id(&self) -> &Self::Id {
694        &self.id
695    }
696
697    fn into_id(self) -> Self::Id {
698        self.id
699    }
700}
701stripe_types::def_id!(CardId);