stripe_shared/
payment_source.rs

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