1#[derive(Clone, Debug)]
2#[cfg_attr(feature = "serialize", derive(serde::Serialize))]
3#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
4pub struct PersonRaceDetails {
5 pub race: Option<Vec<PersonRaceDetailsRace>>,
7 pub race_other: Option<String>,
9}
10#[doc(hidden)]
11pub struct PersonRaceDetailsBuilder {
12 race: Option<Option<Vec<PersonRaceDetailsRace>>>,
13 race_other: Option<Option<String>>,
14}
15
16#[allow(
17 unused_variables,
18 irrefutable_let_patterns,
19 clippy::let_unit_value,
20 clippy::match_single_binding,
21 clippy::single_match
22)]
23const _: () = {
24 use miniserde::de::{Map, Visitor};
25 use miniserde::json::Value;
26 use miniserde::{Deserialize, Result, make_place};
27 use stripe_types::miniserde_helpers::FromValueOpt;
28 use stripe_types::{MapBuilder, ObjectDeser};
29
30 make_place!(Place);
31
32 impl Deserialize for PersonRaceDetails {
33 fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
34 Place::new(out)
35 }
36 }
37
38 struct Builder<'a> {
39 out: &'a mut Option<PersonRaceDetails>,
40 builder: PersonRaceDetailsBuilder,
41 }
42
43 impl Visitor for Place<PersonRaceDetails> {
44 fn map(&mut self) -> Result<Box<dyn Map + '_>> {
45 Ok(Box::new(Builder {
46 out: &mut self.out,
47 builder: PersonRaceDetailsBuilder::deser_default(),
48 }))
49 }
50 }
51
52 impl MapBuilder for PersonRaceDetailsBuilder {
53 type Out = PersonRaceDetails;
54 fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
55 Ok(match k {
56 "race" => Deserialize::begin(&mut self.race),
57 "race_other" => Deserialize::begin(&mut self.race_other),
58
59 _ => <dyn Visitor>::ignore(),
60 })
61 }
62
63 fn deser_default() -> Self {
64 Self { race: Deserialize::default(), race_other: Deserialize::default() }
65 }
66
67 fn take_out(&mut self) -> Option<Self::Out> {
68 let (Some(race), Some(race_other)) = (self.race.take(), self.race_other.take()) else {
69 return None;
70 };
71 Some(Self::Out { race, race_other })
72 }
73 }
74
75 impl Map for Builder<'_> {
76 fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
77 self.builder.key(k)
78 }
79
80 fn finish(&mut self) -> Result<()> {
81 *self.out = self.builder.take_out();
82 Ok(())
83 }
84 }
85
86 impl ObjectDeser for PersonRaceDetails {
87 type Builder = PersonRaceDetailsBuilder;
88 }
89
90 impl FromValueOpt for PersonRaceDetails {
91 fn from_value(v: Value) -> Option<Self> {
92 let Value::Object(obj) = v else {
93 return None;
94 };
95 let mut b = PersonRaceDetailsBuilder::deser_default();
96 for (k, v) in obj {
97 match k.as_str() {
98 "race" => b.race = FromValueOpt::from_value(v),
99 "race_other" => b.race_other = FromValueOpt::from_value(v),
100
101 _ => {}
102 }
103 }
104 b.take_out()
105 }
106 }
107};
108#[derive(Clone, Eq, PartialEq)]
110#[non_exhaustive]
111pub enum PersonRaceDetailsRace {
112 AfricanAmerican,
113 AmericanIndianOrAlaskaNative,
114 Asian,
115 AsianIndian,
116 BlackOrAfricanAmerican,
117 Chinese,
118 Ethiopian,
119 Filipino,
120 GuamanianOrChamorro,
121 Haitian,
122 Jamaican,
123 Japanese,
124 Korean,
125 NativeHawaiian,
126 NativeHawaiianOrOtherPacificIslander,
127 Nigerian,
128 OtherAsian,
129 OtherBlackOrAfricanAmerican,
130 OtherPacificIslander,
131 PreferNotToAnswer,
132 Samoan,
133 Somali,
134 Vietnamese,
135 White,
136 Unknown(String),
138}
139impl PersonRaceDetailsRace {
140 pub fn as_str(&self) -> &str {
141 use PersonRaceDetailsRace::*;
142 match self {
143 AfricanAmerican => "african_american",
144 AmericanIndianOrAlaskaNative => "american_indian_or_alaska_native",
145 Asian => "asian",
146 AsianIndian => "asian_indian",
147 BlackOrAfricanAmerican => "black_or_african_american",
148 Chinese => "chinese",
149 Ethiopian => "ethiopian",
150 Filipino => "filipino",
151 GuamanianOrChamorro => "guamanian_or_chamorro",
152 Haitian => "haitian",
153 Jamaican => "jamaican",
154 Japanese => "japanese",
155 Korean => "korean",
156 NativeHawaiian => "native_hawaiian",
157 NativeHawaiianOrOtherPacificIslander => "native_hawaiian_or_other_pacific_islander",
158 Nigerian => "nigerian",
159 OtherAsian => "other_asian",
160 OtherBlackOrAfricanAmerican => "other_black_or_african_american",
161 OtherPacificIslander => "other_pacific_islander",
162 PreferNotToAnswer => "prefer_not_to_answer",
163 Samoan => "samoan",
164 Somali => "somali",
165 Vietnamese => "vietnamese",
166 White => "white",
167 Unknown(v) => v,
168 }
169 }
170}
171
172impl std::str::FromStr for PersonRaceDetailsRace {
173 type Err = std::convert::Infallible;
174 fn from_str(s: &str) -> Result<Self, Self::Err> {
175 use PersonRaceDetailsRace::*;
176 match s {
177 "african_american" => Ok(AfricanAmerican),
178 "american_indian_or_alaska_native" => Ok(AmericanIndianOrAlaskaNative),
179 "asian" => Ok(Asian),
180 "asian_indian" => Ok(AsianIndian),
181 "black_or_african_american" => Ok(BlackOrAfricanAmerican),
182 "chinese" => Ok(Chinese),
183 "ethiopian" => Ok(Ethiopian),
184 "filipino" => Ok(Filipino),
185 "guamanian_or_chamorro" => Ok(GuamanianOrChamorro),
186 "haitian" => Ok(Haitian),
187 "jamaican" => Ok(Jamaican),
188 "japanese" => Ok(Japanese),
189 "korean" => Ok(Korean),
190 "native_hawaiian" => Ok(NativeHawaiian),
191 "native_hawaiian_or_other_pacific_islander" => Ok(NativeHawaiianOrOtherPacificIslander),
192 "nigerian" => Ok(Nigerian),
193 "other_asian" => Ok(OtherAsian),
194 "other_black_or_african_american" => Ok(OtherBlackOrAfricanAmerican),
195 "other_pacific_islander" => Ok(OtherPacificIslander),
196 "prefer_not_to_answer" => Ok(PreferNotToAnswer),
197 "samoan" => Ok(Samoan),
198 "somali" => Ok(Somali),
199 "vietnamese" => Ok(Vietnamese),
200 "white" => Ok(White),
201 v => Ok(Unknown(v.to_owned())),
202 }
203 }
204}
205impl std::fmt::Display for PersonRaceDetailsRace {
206 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
207 f.write_str(self.as_str())
208 }
209}
210
211impl std::fmt::Debug for PersonRaceDetailsRace {
212 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
213 f.write_str(self.as_str())
214 }
215}
216#[cfg(feature = "serialize")]
217impl serde::Serialize for PersonRaceDetailsRace {
218 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
219 where
220 S: serde::Serializer,
221 {
222 serializer.serialize_str(self.as_str())
223 }
224}
225impl miniserde::Deserialize for PersonRaceDetailsRace {
226 fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
227 crate::Place::new(out)
228 }
229}
230
231impl miniserde::de::Visitor for crate::Place<PersonRaceDetailsRace> {
232 fn string(&mut self, s: &str) -> miniserde::Result<()> {
233 use std::str::FromStr;
234 self.out = Some(PersonRaceDetailsRace::from_str(s).unwrap());
235 Ok(())
236 }
237}
238
239stripe_types::impl_from_val_with_from_str!(PersonRaceDetailsRace);
240#[cfg(feature = "deserialize")]
241impl<'de> serde::Deserialize<'de> for PersonRaceDetailsRace {
242 fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
243 use std::str::FromStr;
244 let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
245 Ok(Self::from_str(&s).unwrap())
246 }
247}