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