Skip to main content

stripe_shared/
payment_source.rs

1/// The resource representing a Stripe Polymorphic
2#[derive(Clone)]
3#[cfg_attr(not(feature = "redact-generated-debug"), derive(Debug))]
4#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
5#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
6#[cfg_attr(any(feature = "deserialize", feature = "serialize"), serde(tag = "object"))]
7pub enum PaymentSource {
8    #[cfg_attr(any(feature = "deserialize", feature = "serialize"), serde(rename = "account"))]
9    Account(stripe_shared::Account),
10    #[cfg_attr(any(feature = "deserialize", feature = "serialize"), serde(rename = "bank_account"))]
11    BankAccount(stripe_shared::BankAccount),
12    #[cfg_attr(any(feature = "deserialize", feature = "serialize"), serde(rename = "card"))]
13    Card(stripe_shared::Card),
14    #[cfg_attr(any(feature = "deserialize", feature = "serialize"), serde(rename = "source"))]
15    Source(stripe_shared::Source),
16}
17
18#[derive(Default)]
19pub struct PaymentSourceBuilder {
20    inner: stripe_types::miniserde_helpers::ObjectBuilderInner,
21}
22
23const _: () = {
24    use miniserde::de::{Map, Visitor};
25    use miniserde::json::Value;
26    use miniserde::{Deserialize, Result, make_place};
27    use stripe_types::MapBuilder;
28    use stripe_types::miniserde_helpers::FromValueOpt;
29
30    use super::*;
31
32    make_place!(Place);
33
34    struct Builder<'a> {
35        out: &'a mut Option<PaymentSource>,
36        builder: PaymentSourceBuilder,
37    }
38
39    impl Deserialize for PaymentSource {
40        fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
41            Place::new(out)
42        }
43    }
44
45    impl Visitor for Place<PaymentSource> {
46        fn map(&mut self) -> Result<Box<dyn Map + '_>> {
47            Ok(Box::new(Builder { out: &mut self.out, builder: Default::default() }))
48        }
49    }
50
51    impl Map for Builder<'_> {
52        fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
53            self.builder.key(k)
54        }
55
56        fn finish(&mut self) -> Result<()> {
57            *self.out = self.builder.take_out();
58            Ok(())
59        }
60    }
61
62    impl MapBuilder for PaymentSourceBuilder {
63        type Out = PaymentSource;
64        fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
65            self.inner.key_inner(k)
66        }
67
68        fn deser_default() -> Self {
69            Self::default()
70        }
71
72        fn take_out(&mut self) -> Option<Self::Out> {
73            let (k, o) = self.inner.finish_inner()?;
74            PaymentSource::construct(&k, o)
75        }
76    }
77
78    impl stripe_types::ObjectDeser for PaymentSource {
79        type Builder = PaymentSourceBuilder;
80    }
81    impl PaymentSource {
82        fn construct(key: &str, o: miniserde::json::Object) -> Option<Self> {
83            Some(match key {
84                "account" => Self::Account(FromValueOpt::from_value(Value::Object(o))?),
85                "bank_account" => Self::BankAccount(FromValueOpt::from_value(Value::Object(o))?),
86                "card" => Self::Card(FromValueOpt::from_value(Value::Object(o))?),
87                "source" => Self::Source(FromValueOpt::from_value(Value::Object(o))?),
88
89                _ => {
90                    tracing::warn!("Unknown object type '{}' for enum '{}'", key, "PaymentSource");
91                    return None;
92                }
93            })
94        }
95    }
96
97    impl FromValueOpt for PaymentSource {
98        fn from_value(v: Value) -> Option<Self> {
99            let (typ, obj) = stripe_types::miniserde_helpers::extract_object_discr(v)?;
100            Self::construct(&typ, obj)
101        }
102    }
103};
104
105#[cfg(feature = "redact-generated-debug")]
106impl std::fmt::Debug for PaymentSource {
107    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
108        f.debug_struct("PaymentSource").finish_non_exhaustive()
109    }
110}
111impl stripe_types::Object for PaymentSource {
112    type Id = smol_str::SmolStr;
113    fn id(&self) -> &Self::Id {
114        match self {
115            Self::Account(v) => v.id.inner(),
116            Self::BankAccount(v) => v.id.inner(),
117            Self::Card(v) => v.id.inner(),
118            Self::Source(v) => v.id.inner(),
119        }
120    }
121
122    fn into_id(self) -> Self::Id {
123        match self {
124            Self::Account(v) => v.id.into_inner(),
125            Self::BankAccount(v) => v.id.into_inner(),
126            Self::Card(v) => v.id.into_inner(),
127            Self::Source(v) => v.id.into_inner(),
128        }
129    }
130}