stripe_shared/
payment_source.rs1#[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}