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(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 _ => {
89 tracing::warn!("Unknown object type '{}' for enum '{}'", key, "PaymentSource");
90 return None;
91 }
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}