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 _ => 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}