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