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