stripe_shared/
person.rs

1/// This is an object representing a person associated with a Stripe account.
2///
3/// A platform can only access a subset of data in a person for an account where [account.controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`, which includes Standard and Express accounts, after creating an Account Link or Account Session to start Connect onboarding.
4///
5/// See the [Standard onboarding](/connect/standard-accounts) or [Express onboarding](/connect/express-accounts) documentation for information about prefilling information and account onboarding steps.
6/// Learn more about [handling identity verification with the API](/connect/handling-api-verification#person-information).
7///
8/// For more details see <<https://stripe.com/docs/api/persons/object>>.
9#[derive(Clone, Debug)]
10#[cfg_attr(feature = "deserialize", derive(serde::Deserialize))]
11pub struct Person {
12    /// The account the person is associated with.
13    pub account: Option<String>,
14    pub additional_tos_acceptances: Option<stripe_shared::PersonAdditionalTosAcceptances>,
15    pub address: Option<stripe_shared::Address>,
16    /// The Kana variation of the person's address (Japan only).
17    pub address_kana: Option<stripe_shared::LegalEntityJapanAddress>,
18    /// The Kanji variation of the person's address (Japan only).
19    pub address_kanji: Option<stripe_shared::LegalEntityJapanAddress>,
20    /// Time at which the object was created. Measured in seconds since the Unix epoch.
21    pub created: stripe_types::Timestamp,
22    pub dob: Option<stripe_shared::LegalEntityDob>,
23    /// The person's email address.
24    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
25    pub email: Option<String>,
26    /// The person's first name.
27    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
28    pub first_name: Option<String>,
29    /// The Kana variation of the person's first name (Japan only).
30    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
31    pub first_name_kana: Option<String>,
32    /// The Kanji variation of the person's first name (Japan only).
33    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
34    pub first_name_kanji: Option<String>,
35    /// A list of alternate names or aliases that the person is known by.
36    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
37    pub full_name_aliases: Option<Vec<String>>,
38    /// Information about the [upcoming new requirements for this person](https://stripe.com/docs/connect/custom-accounts/future-requirements), including what information needs to be collected, and by when.
39    pub future_requirements: Option<stripe_shared::PersonFutureRequirements>,
40    /// The person's gender.
41    pub gender: Option<String>,
42    /// Unique identifier for the object.
43    pub id: stripe_shared::PersonId,
44    /// Whether the person's `id_number` was provided.
45    /// True if either the full ID number was provided or if only the required part of the ID number was provided (ex.
46    /// last four of an individual's SSN for the US indicated by `ssn_last_4_provided`).
47    pub id_number_provided: Option<bool>,
48    /// Whether the person's `id_number_secondary` was provided.
49    pub id_number_secondary_provided: Option<bool>,
50    /// The person's last name.
51    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
52    pub last_name: Option<String>,
53    /// The Kana variation of the person's last name (Japan only).
54    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
55    pub last_name_kana: Option<String>,
56    /// The Kanji variation of the person's last name (Japan only).
57    /// Also available for accounts where [controller.requirement_collection](/api/accounts/object#account_object-controller-requirement_collection) is `stripe`.
58    pub last_name_kanji: Option<String>,
59    /// The person's maiden name.
60    pub maiden_name: Option<String>,
61    /// Set of [key-value pairs](https://stripe.com/docs/api/metadata) that you can attach to an object.
62    /// This can be useful for storing additional information about the object in a structured format.
63    pub metadata: Option<std::collections::HashMap<String, String>>,
64    /// The country where the person is a national.
65    pub nationality: Option<String>,
66    /// The person's phone number.
67    pub phone: Option<String>,
68    /// Indicates if the person or any of their representatives, family members, or other closely related persons, declares that they hold or have held an important public job or function, in any jurisdiction.
69    pub political_exposure: Option<stripe_shared::PersonPoliticalExposure>,
70    pub registered_address: Option<stripe_shared::Address>,
71    pub relationship: Option<stripe_shared::PersonRelationship>,
72    /// Information about the requirements for this person, including what information needs to be collected, and by when.
73    pub requirements: Option<stripe_shared::PersonRequirements>,
74    /// Whether the last four digits of the person's Social Security number have been provided (U.S. only).
75    pub ssn_last_4_provided: Option<bool>,
76    /// Demographic data related to the person.
77    pub us_cfpb_data: Option<stripe_shared::PersonUsCfpbData>,
78    pub verification: Option<stripe_shared::LegalEntityPersonVerification>,
79}
80#[doc(hidden)]
81pub struct PersonBuilder {
82    account: Option<Option<String>>,
83    additional_tos_acceptances: Option<Option<stripe_shared::PersonAdditionalTosAcceptances>>,
84    address: Option<Option<stripe_shared::Address>>,
85    address_kana: Option<Option<stripe_shared::LegalEntityJapanAddress>>,
86    address_kanji: Option<Option<stripe_shared::LegalEntityJapanAddress>>,
87    created: Option<stripe_types::Timestamp>,
88    dob: Option<Option<stripe_shared::LegalEntityDob>>,
89    email: Option<Option<String>>,
90    first_name: Option<Option<String>>,
91    first_name_kana: Option<Option<String>>,
92    first_name_kanji: Option<Option<String>>,
93    full_name_aliases: Option<Option<Vec<String>>>,
94    future_requirements: Option<Option<stripe_shared::PersonFutureRequirements>>,
95    gender: Option<Option<String>>,
96    id: Option<stripe_shared::PersonId>,
97    id_number_provided: Option<Option<bool>>,
98    id_number_secondary_provided: Option<Option<bool>>,
99    last_name: Option<Option<String>>,
100    last_name_kana: Option<Option<String>>,
101    last_name_kanji: Option<Option<String>>,
102    maiden_name: Option<Option<String>>,
103    metadata: Option<Option<std::collections::HashMap<String, String>>>,
104    nationality: Option<Option<String>>,
105    phone: Option<Option<String>>,
106    political_exposure: Option<Option<stripe_shared::PersonPoliticalExposure>>,
107    registered_address: Option<Option<stripe_shared::Address>>,
108    relationship: Option<Option<stripe_shared::PersonRelationship>>,
109    requirements: Option<Option<stripe_shared::PersonRequirements>>,
110    ssn_last_4_provided: Option<Option<bool>>,
111    us_cfpb_data: Option<Option<stripe_shared::PersonUsCfpbData>>,
112    verification: Option<Option<stripe_shared::LegalEntityPersonVerification>>,
113}
114
115#[allow(
116    unused_variables,
117    irrefutable_let_patterns,
118    clippy::let_unit_value,
119    clippy::match_single_binding,
120    clippy::single_match
121)]
122const _: () = {
123    use miniserde::de::{Map, Visitor};
124    use miniserde::json::Value;
125    use miniserde::{make_place, Deserialize, Result};
126    use stripe_types::miniserde_helpers::FromValueOpt;
127    use stripe_types::{MapBuilder, ObjectDeser};
128
129    make_place!(Place);
130
131    impl Deserialize for Person {
132        fn begin(out: &mut Option<Self>) -> &mut dyn Visitor {
133            Place::new(out)
134        }
135    }
136
137    struct Builder<'a> {
138        out: &'a mut Option<Person>,
139        builder: PersonBuilder,
140    }
141
142    impl Visitor for Place<Person> {
143        fn map(&mut self) -> Result<Box<dyn Map + '_>> {
144            Ok(Box::new(Builder { out: &mut self.out, builder: PersonBuilder::deser_default() }))
145        }
146    }
147
148    impl MapBuilder for PersonBuilder {
149        type Out = Person;
150        fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
151            Ok(match k {
152                "account" => Deserialize::begin(&mut self.account),
153                "additional_tos_acceptances" => {
154                    Deserialize::begin(&mut self.additional_tos_acceptances)
155                }
156                "address" => Deserialize::begin(&mut self.address),
157                "address_kana" => Deserialize::begin(&mut self.address_kana),
158                "address_kanji" => Deserialize::begin(&mut self.address_kanji),
159                "created" => Deserialize::begin(&mut self.created),
160                "dob" => Deserialize::begin(&mut self.dob),
161                "email" => Deserialize::begin(&mut self.email),
162                "first_name" => Deserialize::begin(&mut self.first_name),
163                "first_name_kana" => Deserialize::begin(&mut self.first_name_kana),
164                "first_name_kanji" => Deserialize::begin(&mut self.first_name_kanji),
165                "full_name_aliases" => Deserialize::begin(&mut self.full_name_aliases),
166                "future_requirements" => Deserialize::begin(&mut self.future_requirements),
167                "gender" => Deserialize::begin(&mut self.gender),
168                "id" => Deserialize::begin(&mut self.id),
169                "id_number_provided" => Deserialize::begin(&mut self.id_number_provided),
170                "id_number_secondary_provided" => {
171                    Deserialize::begin(&mut self.id_number_secondary_provided)
172                }
173                "last_name" => Deserialize::begin(&mut self.last_name),
174                "last_name_kana" => Deserialize::begin(&mut self.last_name_kana),
175                "last_name_kanji" => Deserialize::begin(&mut self.last_name_kanji),
176                "maiden_name" => Deserialize::begin(&mut self.maiden_name),
177                "metadata" => Deserialize::begin(&mut self.metadata),
178                "nationality" => Deserialize::begin(&mut self.nationality),
179                "phone" => Deserialize::begin(&mut self.phone),
180                "political_exposure" => Deserialize::begin(&mut self.political_exposure),
181                "registered_address" => Deserialize::begin(&mut self.registered_address),
182                "relationship" => Deserialize::begin(&mut self.relationship),
183                "requirements" => Deserialize::begin(&mut self.requirements),
184                "ssn_last_4_provided" => Deserialize::begin(&mut self.ssn_last_4_provided),
185                "us_cfpb_data" => Deserialize::begin(&mut self.us_cfpb_data),
186                "verification" => Deserialize::begin(&mut self.verification),
187
188                _ => <dyn Visitor>::ignore(),
189            })
190        }
191
192        fn deser_default() -> Self {
193            Self {
194                account: Deserialize::default(),
195                additional_tos_acceptances: Deserialize::default(),
196                address: Deserialize::default(),
197                address_kana: Deserialize::default(),
198                address_kanji: Deserialize::default(),
199                created: Deserialize::default(),
200                dob: Deserialize::default(),
201                email: Deserialize::default(),
202                first_name: Deserialize::default(),
203                first_name_kana: Deserialize::default(),
204                first_name_kanji: Deserialize::default(),
205                full_name_aliases: Deserialize::default(),
206                future_requirements: Deserialize::default(),
207                gender: Deserialize::default(),
208                id: Deserialize::default(),
209                id_number_provided: Deserialize::default(),
210                id_number_secondary_provided: Deserialize::default(),
211                last_name: Deserialize::default(),
212                last_name_kana: Deserialize::default(),
213                last_name_kanji: Deserialize::default(),
214                maiden_name: Deserialize::default(),
215                metadata: Deserialize::default(),
216                nationality: Deserialize::default(),
217                phone: Deserialize::default(),
218                political_exposure: Deserialize::default(),
219                registered_address: Deserialize::default(),
220                relationship: Deserialize::default(),
221                requirements: Deserialize::default(),
222                ssn_last_4_provided: Deserialize::default(),
223                us_cfpb_data: Deserialize::default(),
224                verification: Deserialize::default(),
225            }
226        }
227
228        fn take_out(&mut self) -> Option<Self::Out> {
229            let (
230                Some(account),
231                Some(additional_tos_acceptances),
232                Some(address),
233                Some(address_kana),
234                Some(address_kanji),
235                Some(created),
236                Some(dob),
237                Some(email),
238                Some(first_name),
239                Some(first_name_kana),
240                Some(first_name_kanji),
241                Some(full_name_aliases),
242                Some(future_requirements),
243                Some(gender),
244                Some(id),
245                Some(id_number_provided),
246                Some(id_number_secondary_provided),
247                Some(last_name),
248                Some(last_name_kana),
249                Some(last_name_kanji),
250                Some(maiden_name),
251                Some(metadata),
252                Some(nationality),
253                Some(phone),
254                Some(political_exposure),
255                Some(registered_address),
256                Some(relationship),
257                Some(requirements),
258                Some(ssn_last_4_provided),
259                Some(us_cfpb_data),
260                Some(verification),
261            ) = (
262                self.account.take(),
263                self.additional_tos_acceptances.take(),
264                self.address.take(),
265                self.address_kana.take(),
266                self.address_kanji.take(),
267                self.created,
268                self.dob,
269                self.email.take(),
270                self.first_name.take(),
271                self.first_name_kana.take(),
272                self.first_name_kanji.take(),
273                self.full_name_aliases.take(),
274                self.future_requirements.take(),
275                self.gender.take(),
276                self.id.take(),
277                self.id_number_provided,
278                self.id_number_secondary_provided,
279                self.last_name.take(),
280                self.last_name_kana.take(),
281                self.last_name_kanji.take(),
282                self.maiden_name.take(),
283                self.metadata.take(),
284                self.nationality.take(),
285                self.phone.take(),
286                self.political_exposure,
287                self.registered_address.take(),
288                self.relationship.take(),
289                self.requirements.take(),
290                self.ssn_last_4_provided,
291                self.us_cfpb_data.take(),
292                self.verification.take(),
293            )
294            else {
295                return None;
296            };
297            Some(Self::Out {
298                account,
299                additional_tos_acceptances,
300                address,
301                address_kana,
302                address_kanji,
303                created,
304                dob,
305                email,
306                first_name,
307                first_name_kana,
308                first_name_kanji,
309                full_name_aliases,
310                future_requirements,
311                gender,
312                id,
313                id_number_provided,
314                id_number_secondary_provided,
315                last_name,
316                last_name_kana,
317                last_name_kanji,
318                maiden_name,
319                metadata,
320                nationality,
321                phone,
322                political_exposure,
323                registered_address,
324                relationship,
325                requirements,
326                ssn_last_4_provided,
327                us_cfpb_data,
328                verification,
329            })
330        }
331    }
332
333    impl<'a> Map for Builder<'a> {
334        fn key(&mut self, k: &str) -> Result<&mut dyn Visitor> {
335            self.builder.key(k)
336        }
337
338        fn finish(&mut self) -> Result<()> {
339            *self.out = self.builder.take_out();
340            Ok(())
341        }
342    }
343
344    impl ObjectDeser for Person {
345        type Builder = PersonBuilder;
346    }
347
348    impl FromValueOpt for Person {
349        fn from_value(v: Value) -> Option<Self> {
350            let Value::Object(obj) = v else {
351                return None;
352            };
353            let mut b = PersonBuilder::deser_default();
354            for (k, v) in obj {
355                match k.as_str() {
356                    "account" => b.account = FromValueOpt::from_value(v),
357                    "additional_tos_acceptances" => {
358                        b.additional_tos_acceptances = FromValueOpt::from_value(v)
359                    }
360                    "address" => b.address = FromValueOpt::from_value(v),
361                    "address_kana" => b.address_kana = FromValueOpt::from_value(v),
362                    "address_kanji" => b.address_kanji = FromValueOpt::from_value(v),
363                    "created" => b.created = FromValueOpt::from_value(v),
364                    "dob" => b.dob = FromValueOpt::from_value(v),
365                    "email" => b.email = FromValueOpt::from_value(v),
366                    "first_name" => b.first_name = FromValueOpt::from_value(v),
367                    "first_name_kana" => b.first_name_kana = FromValueOpt::from_value(v),
368                    "first_name_kanji" => b.first_name_kanji = FromValueOpt::from_value(v),
369                    "full_name_aliases" => b.full_name_aliases = FromValueOpt::from_value(v),
370                    "future_requirements" => b.future_requirements = FromValueOpt::from_value(v),
371                    "gender" => b.gender = FromValueOpt::from_value(v),
372                    "id" => b.id = FromValueOpt::from_value(v),
373                    "id_number_provided" => b.id_number_provided = FromValueOpt::from_value(v),
374                    "id_number_secondary_provided" => {
375                        b.id_number_secondary_provided = FromValueOpt::from_value(v)
376                    }
377                    "last_name" => b.last_name = FromValueOpt::from_value(v),
378                    "last_name_kana" => b.last_name_kana = FromValueOpt::from_value(v),
379                    "last_name_kanji" => b.last_name_kanji = FromValueOpt::from_value(v),
380                    "maiden_name" => b.maiden_name = FromValueOpt::from_value(v),
381                    "metadata" => b.metadata = FromValueOpt::from_value(v),
382                    "nationality" => b.nationality = FromValueOpt::from_value(v),
383                    "phone" => b.phone = FromValueOpt::from_value(v),
384                    "political_exposure" => b.political_exposure = FromValueOpt::from_value(v),
385                    "registered_address" => b.registered_address = FromValueOpt::from_value(v),
386                    "relationship" => b.relationship = FromValueOpt::from_value(v),
387                    "requirements" => b.requirements = FromValueOpt::from_value(v),
388                    "ssn_last_4_provided" => b.ssn_last_4_provided = FromValueOpt::from_value(v),
389                    "us_cfpb_data" => b.us_cfpb_data = FromValueOpt::from_value(v),
390                    "verification" => b.verification = FromValueOpt::from_value(v),
391
392                    _ => {}
393                }
394            }
395            b.take_out()
396        }
397    }
398};
399#[cfg(feature = "serialize")]
400impl serde::Serialize for Person {
401    fn serialize<S: serde::Serializer>(&self, s: S) -> Result<S::Ok, S::Error> {
402        use serde::ser::SerializeStruct;
403        let mut s = s.serialize_struct("Person", 32)?;
404        s.serialize_field("account", &self.account)?;
405        s.serialize_field("additional_tos_acceptances", &self.additional_tos_acceptances)?;
406        s.serialize_field("address", &self.address)?;
407        s.serialize_field("address_kana", &self.address_kana)?;
408        s.serialize_field("address_kanji", &self.address_kanji)?;
409        s.serialize_field("created", &self.created)?;
410        s.serialize_field("dob", &self.dob)?;
411        s.serialize_field("email", &self.email)?;
412        s.serialize_field("first_name", &self.first_name)?;
413        s.serialize_field("first_name_kana", &self.first_name_kana)?;
414        s.serialize_field("first_name_kanji", &self.first_name_kanji)?;
415        s.serialize_field("full_name_aliases", &self.full_name_aliases)?;
416        s.serialize_field("future_requirements", &self.future_requirements)?;
417        s.serialize_field("gender", &self.gender)?;
418        s.serialize_field("id", &self.id)?;
419        s.serialize_field("id_number_provided", &self.id_number_provided)?;
420        s.serialize_field("id_number_secondary_provided", &self.id_number_secondary_provided)?;
421        s.serialize_field("last_name", &self.last_name)?;
422        s.serialize_field("last_name_kana", &self.last_name_kana)?;
423        s.serialize_field("last_name_kanji", &self.last_name_kanji)?;
424        s.serialize_field("maiden_name", &self.maiden_name)?;
425        s.serialize_field("metadata", &self.metadata)?;
426        s.serialize_field("nationality", &self.nationality)?;
427        s.serialize_field("phone", &self.phone)?;
428        s.serialize_field("political_exposure", &self.political_exposure)?;
429        s.serialize_field("registered_address", &self.registered_address)?;
430        s.serialize_field("relationship", &self.relationship)?;
431        s.serialize_field("requirements", &self.requirements)?;
432        s.serialize_field("ssn_last_4_provided", &self.ssn_last_4_provided)?;
433        s.serialize_field("us_cfpb_data", &self.us_cfpb_data)?;
434        s.serialize_field("verification", &self.verification)?;
435
436        s.serialize_field("object", "person")?;
437        s.end()
438    }
439}
440impl stripe_types::Object for Person {
441    type Id = stripe_shared::PersonId;
442    fn id(&self) -> &Self::Id {
443        &self.id
444    }
445
446    fn into_id(self) -> Self::Id {
447        self.id
448    }
449}
450stripe_types::def_id!(PersonId);
451#[derive(Copy, Clone, Eq, PartialEq)]
452pub enum PersonPoliticalExposure {
453    Existing,
454    None,
455}
456impl PersonPoliticalExposure {
457    pub fn as_str(self) -> &'static str {
458        use PersonPoliticalExposure::*;
459        match self {
460            Existing => "existing",
461            None => "none",
462        }
463    }
464}
465
466impl std::str::FromStr for PersonPoliticalExposure {
467    type Err = stripe_types::StripeParseError;
468    fn from_str(s: &str) -> Result<Self, Self::Err> {
469        use PersonPoliticalExposure::*;
470        match s {
471            "existing" => Ok(Existing),
472            "none" => Ok(None),
473            _ => Err(stripe_types::StripeParseError),
474        }
475    }
476}
477impl std::fmt::Display for PersonPoliticalExposure {
478    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
479        f.write_str(self.as_str())
480    }
481}
482
483impl std::fmt::Debug for PersonPoliticalExposure {
484    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
485        f.write_str(self.as_str())
486    }
487}
488impl serde::Serialize for PersonPoliticalExposure {
489    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
490    where
491        S: serde::Serializer,
492    {
493        serializer.serialize_str(self.as_str())
494    }
495}
496impl miniserde::Deserialize for PersonPoliticalExposure {
497    fn begin(out: &mut Option<Self>) -> &mut dyn miniserde::de::Visitor {
498        crate::Place::new(out)
499    }
500}
501
502impl miniserde::de::Visitor for crate::Place<PersonPoliticalExposure> {
503    fn string(&mut self, s: &str) -> miniserde::Result<()> {
504        use std::str::FromStr;
505        self.out = Some(PersonPoliticalExposure::from_str(s).map_err(|_| miniserde::Error)?);
506        Ok(())
507    }
508}
509
510stripe_types::impl_from_val_with_from_str!(PersonPoliticalExposure);
511#[cfg(feature = "deserialize")]
512impl<'de> serde::Deserialize<'de> for PersonPoliticalExposure {
513    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
514        use std::str::FromStr;
515        let s: std::borrow::Cow<'de, str> = serde::Deserialize::deserialize(deserializer)?;
516        Self::from_str(&s)
517            .map_err(|_| serde::de::Error::custom("Unknown value for PersonPoliticalExposure"))
518    }
519}