credential_exchange_format/
identity.rs

1//! # Identity Credentials
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    EditableField, EditableFieldConcealedString, EditableFieldCountryCode, EditableFieldDate,
7    EditableFieldString, EditableFieldSubdivisionCode, EditableFieldYearMonth,
8};
9
10/// An [AddressCredential] provides information for autofilling address forms.
11#[derive(Clone, Debug, Default, Serialize, Deserialize)]
12#[serde(rename_all = "camelCase", bound(deserialize = "E: Deserialize<'de>"))]
13pub struct AddressCredential<E = ()> {
14    /// The address line for the address. This is intentionally flexible to accommodate different
15    /// address formats. Implementers MUST support multi-line addresses for this field, where each
16    /// line is separated by a `\n` line feed.
17    #[serde(default, skip_serializing_if = "Option::is_none")]
18    pub street_address: Option<EditableField<EditableFieldString, E>>,
19    /// The ZIP or postal code for the address.
20    #[serde(default, skip_serializing_if = "Option::is_none")]
21    pub postal_code: Option<EditableField<EditableFieldString, E>>,
22    /// The city for the address.
23    #[serde(default, skip_serializing_if = "Option::is_none")]
24    pub city: Option<EditableField<EditableFieldString, E>>,
25    /// The province, state, or territory for the address.
26    #[serde(default, skip_serializing_if = "Option::is_none")]
27    pub territory: Option<EditableField<EditableFieldSubdivisionCode, E>>,
28    /// The country for the address. This MUST conform to the
29    /// [ISO 3166-1 alpha-2](https://www.iso.org/iso-3166-country-codes.html) format.
30    #[serde(default, skip_serializing_if = "Option::is_none")]
31    pub country: Option<EditableField<EditableFieldCountryCode, E>>,
32    /// The phone number associated with the address.
33    #[serde(default, skip_serializing_if = "Option::is_none")]
34    pub tel: Option<EditableField<EditableFieldString, E>>,
35}
36
37#[derive(Clone, Debug, Default, Serialize, Deserialize)]
38#[serde(rename_all = "camelCase", bound(deserialize = "E: Deserialize<'de>"))]
39pub struct CreditCardCredential<E = ()> {
40    /// The credit card number.
41    #[serde(default, skip_serializing_if = "Option::is_none")]
42    pub number: Option<EditableField<EditableFieldConcealedString, E>>,
43    /// The full name printed on the card.
44    #[serde(default, skip_serializing_if = "Option::is_none")]
45    pub full_name: Option<EditableField<EditableFieldString, E>>,
46    /// The vendor of the card.
47    #[serde(default, skip_serializing_if = "Option::is_none")]
48    pub card_type: Option<EditableField<EditableFieldString, E>>,
49    /// The verification number/value/code (CVV, CVC).
50    #[serde(default, skip_serializing_if = "Option::is_none")]
51    pub verification_number: Option<EditableField<EditableFieldConcealedString, E>>,
52    /// The personal identification number (PIN).
53    #[serde(default, skip_serializing_if = "Option::is_none")]
54    pub pin: Option<EditableField<EditableFieldConcealedString, E>>,
55    /// The expiration date of the card.
56    #[serde(default, skip_serializing_if = "Option::is_none")]
57    pub expiry_date: Option<EditableField<EditableFieldYearMonth, E>>,
58    /// The date from which the card is valid.
59    #[serde(default, skip_serializing_if = "Option::is_none")]
60    pub valid_from: Option<EditableField<EditableFieldYearMonth, E>>,
61}
62
63/// A [DriversLicenseCredential] contains information about a person’s driver’s license. The fields
64/// reflect the relevant set of mandatory data fields defined by
65/// [ISO 18013-1](https://www.iso.org/standard/63798.html).
66#[derive(Clone, Debug, Default, Serialize, Deserialize)]
67#[serde(rename_all = "camelCase", bound(deserialize = "E: Deserialize<'de>"))]
68pub struct DriversLicenseCredential<E = ()> {
69    /// The full name of the license holder.
70    #[serde(default, skip_serializing_if = "Option::is_none")]
71    pub full_name: Option<EditableField<EditableFieldString, E>>,
72    /// Day, month, and year on which the license holder was born.
73    #[serde(default, skip_serializing_if = "Option::is_none")]
74    pub birth_date: Option<EditableField<EditableFieldDate, E>>,
75    /// The date on which the license was issued.
76    #[serde(default, skip_serializing_if = "Option::is_none")]
77    pub issue_date: Option<EditableField<EditableFieldDate, E>>,
78    /// The date on which the license expires.
79    #[serde(default, skip_serializing_if = "Option::is_none")]
80    pub expiry_date: Option<EditableField<EditableFieldDate, E>>,
81    /// The official body or government agency responsible for issuing the license.
82    #[serde(default, skip_serializing_if = "Option::is_none")]
83    pub issuing_authority: Option<EditableField<EditableFieldString, E>>,
84    /// The principal administrative subdivision of the license’s country of origin. Examples of
85    /// administrative subdivisions are states or provinces. This MUST conform to the ISO 3166-2
86    /// format.
87    #[serde(default, skip_serializing_if = "Option::is_none")]
88    pub territory: Option<EditableField<EditableFieldSubdivisionCode, E>>,
89    /// The license’s country of origin. This MUST conform to the ISO 3166-1 alpha-2 format.
90    #[serde(default, skip_serializing_if = "Option::is_none")]
91    pub country: Option<EditableField<EditableFieldCountryCode, E>>,
92    /// The number assigned by the issuing authority.
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub license_number: Option<EditableField<EditableFieldString, E>>,
95    ///  The vehicle types the license holder is authorized to operate.
96    #[serde(default, skip_serializing_if = "Option::is_none")]
97    pub license_class: Option<EditableField<EditableFieldString, E>>,
98}
99
100/// An [IdentityDocumentCredential] is for any document, card, or number identifying a person or
101/// entity. Examples include national ID cards, Social Security Numbers (SSN), Tax Identification
102/// Numbers (TIN), health insurance cards, or Value-Added Tax (VAT) numbers.
103///
104/// Credentials like the SSN can still be encoded as an IdentityDocument by only providing the
105/// identificationNumber field, since the others are generally considered to be undefined in its
106/// case.
107///
108/// Note: Driver’s licenses and passports may be accepted as identity verification in some
109/// countries, but they are specified separately in the [DriversLicenseCredential] and
110/// [PassportCredential] types, respectively.
111#[derive(Clone, Debug, Default, Serialize, Deserialize)]
112#[serde(rename_all = "camelCase", bound(deserialize = "E: Deserialize<'de>"))]
113pub struct IdentityDocumentCredential<E = ()> {
114    /// The document’s issuing country. This MUST conform to the ISO 3166-1 alpha-2 format.
115    #[serde(default, skip_serializing_if = "Option::is_none")]
116    pub issuing_country: Option<EditableField<EditableFieldCountryCode, E>>,
117    /// The document’s identifying number. This identifying number is tied to the issuance of the
118    /// document and is expected to change upon its reissuance, even when the person’s information
119    /// might remain the same.
120    #[serde(default, skip_serializing_if = "Option::is_none")]
121    pub document_number: Option<EditableField<EditableFieldString, E>>,
122    /// The person’s or other entity’s identification number. This identifying number is generally
123    /// expected to remain stable across reissuances of the identity document itself. For
124    /// identification numbers that are not an identity document (e.g., SSN, TIN, or VAT), this
125    /// field is generally the only one that’s expected to be present in the credential.
126    #[serde(default, skip_serializing_if = "Option::is_none")]
127    pub identification_number: Option<EditableField<EditableFieldString, E>>,
128    /// The person’s nationality.
129    #[serde(default, skip_serializing_if = "Option::is_none")]
130    pub nationality: Option<EditableField<EditableFieldString, E>>,
131    /// The person’s full name.
132    #[serde(default, skip_serializing_if = "Option::is_none")]
133    pub full_name: Option<EditableField<EditableFieldString, E>>,
134    /// The person’s date of birth.
135    #[serde(default, skip_serializing_if = "Option::is_none")]
136    pub birth_date: Option<EditableField<EditableFieldDate, E>>,
137    /// The person’s place of birth.
138    #[serde(default, skip_serializing_if = "Option::is_none")]
139    pub birth_place: Option<EditableField<EditableFieldString, E>>,
140    /// The person’s sex or gender.
141    #[serde(default, skip_serializing_if = "Option::is_none")]
142    pub sex: Option<EditableField<EditableFieldString, E>>,
143    /// The date on which the document was issued.
144    #[serde(default, skip_serializing_if = "Option::is_none")]
145    pub issue_date: Option<EditableField<EditableFieldDate, E>>,
146    /// The date on which the document expires.
147    #[serde(default, skip_serializing_if = "Option::is_none")]
148    pub expiry_date: Option<EditableField<EditableFieldDate, E>>,
149    /// The official body or government agency responsible for issuing the document.
150    #[serde(default, skip_serializing_if = "Option::is_none")]
151    pub issuing_authority: Option<EditableField<EditableFieldString, E>>,
152}
153
154/// A [PassportCredential] contains the details of a person’s passport. The fields reflect the
155/// relevant set of data elements defined by ICAO Doc 9303 Part 4.
156#[derive(Clone, Debug, Default, Serialize, Deserialize)]
157#[serde(rename_all = "camelCase", bound(deserialize = "E: Deserialize<'de>"))]
158pub struct PassportCredential<E = ()> {
159    /// The passport’s issuing country. This MUST conform to the ISO 3166-1 alpha-2 format.
160    #[serde(default, skip_serializing_if = "Option::is_none")]
161    pub issuing_country: Option<EditableField<EditableFieldCountryCode, E>>,
162    /// The passport’s document type. This MUST be a valid document code as defined in ICAO Doc
163    /// 9303 Part 4.
164    #[serde(default, skip_serializing_if = "Option::is_none")]
165    pub passport_type: Option<EditableField<EditableFieldString, E>>,
166    /// The passport’s identifying number.
167    #[serde(default, skip_serializing_if = "Option::is_none")]
168    pub passport_number: Option<EditableField<EditableFieldString, E>>,
169    /// The person’s national identification number.
170    #[serde(default, skip_serializing_if = "Option::is_none")]
171    pub national_identification_number: Option<EditableField<EditableFieldString, E>>,
172    /// The person’s nationality.
173    #[serde(default, skip_serializing_if = "Option::is_none")]
174    pub nationality: Option<EditableField<EditableFieldString, E>>,
175    /// The person’s full name.
176    #[serde(default, skip_serializing_if = "Option::is_none")]
177    pub full_name: Option<EditableField<EditableFieldString, E>>,
178    /// The person’s date of birth.
179    #[serde(default, skip_serializing_if = "Option::is_none")]
180    pub birth_date: Option<EditableField<EditableFieldDate, E>>,
181    /// The person’s place of birth.
182    #[serde(default, skip_serializing_if = "Option::is_none")]
183    pub birth_place: Option<EditableField<EditableFieldString, E>>,
184    #[serde(default, skip_serializing_if = "Option::is_none")]
185    /// The person’s sex or gender.
186    pub sex: Option<EditableField<EditableFieldString, E>>,
187    #[serde(default, skip_serializing_if = "Option::is_none")]
188    /// The date on which the passport was issued.
189    pub issue_date: Option<EditableField<EditableFieldDate, E>>,
190    /// The date on which the passport expires.
191    #[serde(default, skip_serializing_if = "Option::is_none")]
192    pub expiry_date: Option<EditableField<EditableFieldDate, E>>,
193    /// The official body or government agency responsible for issuing the passport.
194    #[serde(default, skip_serializing_if = "Option::is_none")]
195    pub issuing_authority: Option<EditableField<EditableFieldString, E>>,
196}
197
198/// A [PersonNameCredential] represents a person’s name as fields derived from Unicode Locale Data
199/// Markup Language Part 8: Person Names.
200///
201/// All fields are marked as optional because an exporting provider SHOULD refrain from making
202/// decisions about splitting up a name into any parts that were not explicitly provided as such,
203/// since that often introduces errors.
204#[derive(Clone, Debug, Default, Serialize, Deserialize)]
205#[serde(rename_all = "camelCase", bound(deserialize = "E: Deserialize<'de>"))]
206pub struct PersonNameCredential<E = ()> {
207    /// This field contains a title or honorific qualifier. For example, "Ms.", "Mr.", or "Dr".
208    #[serde(default, skip_serializing_if = "Option::is_none")]
209    pub title: Option<EditableField<EditableFieldString, E>>,
210    /// This field the person’s given name.
211    #[serde(default, skip_serializing_if = "Option::is_none")]
212    pub given: Option<EditableField<EditableFieldString, E>>,
213    /// This field contains a nickname or preferred name.
214    #[serde(default, skip_serializing_if = "Option::is_none")]
215    pub given_informal: Option<EditableField<EditableFieldString, E>>,
216    /// This field contains additional names or middle names.
217    #[serde(default, skip_serializing_if = "Option::is_none")]
218    pub given2: Option<EditableField<EditableFieldString, E>>,
219    /// This field contains the prefix of the surname. For example, "van der" in "van der Poel" or
220    /// "bint" in "bint Fadi".
221    #[serde(default, skip_serializing_if = "Option::is_none")]
222    pub surname_prefix: Option<EditableField<EditableFieldString, E>>,
223    /// This field contains the person’s family name.
224    #[serde(default, skip_serializing_if = "Option::is_none")]
225    pub surname: Option<EditableField<EditableFieldString, E>>,
226    /// This field contains the person’s secondary surname, which is used in some cultures.
227    #[serde(default, skip_serializing_if = "Option::is_none")]
228    pub surname2: Option<EditableField<EditableFieldString, E>>,
229    /// This field contains a credential or accreditation qualifier. For example, "PhD" or "MBA".
230    #[serde(default, skip_serializing_if = "Option::is_none")]
231    pub credentials: Option<EditableField<EditableFieldString, E>>,
232    /// This field contains a generation qualifier. For example, "Jr." or "III".
233    #[serde(default, skip_serializing_if = "Option::is_none")]
234    pub generation: Option<EditableField<EditableFieldString, E>>,
235}