Skip to main content

telers/types/
encrypted_passport_element.rs

1use serde::{Deserialize, Serialize};
2/// Describes documents or other Telegram Passport elements shared with the bot by the user.
3/// Currently, it can be one of
4/// - [`crate::types::EncryptedPassportElementAddress`]
5/// - [`crate::types::EncryptedPassportElementBankStatement`]
6/// - [`crate::types::EncryptedPassportElementDriverLicense`]
7/// - [`crate::types::EncryptedPassportElementEmail`]
8/// - [`crate::types::EncryptedPassportElementIdentityCard`]
9/// - [`crate::types::EncryptedPassportElementInternalPassport`]
10/// - [`crate::types::EncryptedPassportElementPassport`]
11/// - [`crate::types::EncryptedPassportElementPassportRegistration`]
12/// - [`crate::types::EncryptedPassportElementPersonalDetails`]
13/// - [`crate::types::EncryptedPassportElementPhoneNumber`]
14/// - [`crate::types::EncryptedPassportElementRentalAgreement`]
15/// - [`crate::types::EncryptedPassportElementTemporaryRegistration`]
16/// - [`crate::types::EncryptedPassportElementUtilityBill`]
17/// # Documentation
18/// <https://core.telegram.org/bots/api#encryptedpassportelement>
19#[derive(Clone, Debug, Serialize, Deserialize)]
20#[serde(tag = "type", rename_all = "snake_case")]
21pub enum EncryptedPassportElement {
22    PersonalDetails(crate::types::EncryptedPassportElementPersonalDetails),
23    Passport(crate::types::EncryptedPassportElementPassport),
24    DriverLicense(crate::types::EncryptedPassportElementDriverLicense),
25    IdentityCard(crate::types::EncryptedPassportElementIdentityCard),
26    InternalPassport(crate::types::EncryptedPassportElementInternalPassport),
27    Address(crate::types::EncryptedPassportElementAddress),
28    UtilityBill(crate::types::EncryptedPassportElementUtilityBill),
29    BankStatement(crate::types::EncryptedPassportElementBankStatement),
30    RentalAgreement(crate::types::EncryptedPassportElementRentalAgreement),
31    PassportRegistration(crate::types::EncryptedPassportElementPassportRegistration),
32    TemporaryRegistration(crate::types::EncryptedPassportElementTemporaryRegistration),
33    PhoneNumber(crate::types::EncryptedPassportElementPhoneNumber),
34    Email(crate::types::EncryptedPassportElementEmail),
35}
36impl EncryptedPassportElement {
37    /// Helper method for field `data`.
38    ///
39    /// Base64-encoded encrypted Telegram Passport element data provided by the user; available only for `personal_details`, `passport`, `driver_license`, `identity_card`, `internal_passport` and `address` types. Can be decrypted and verified using the accompanying [`crate::types::EncryptedCredentials`].
40    #[must_use]
41    pub fn data(&self) -> Option<&str> {
42        match self {
43            Self::PersonalDetails(val) => Some(val.data.as_ref()),
44            Self::Passport(val) => Some(val.data.as_ref()),
45            Self::DriverLicense(val) => Some(val.data.as_ref()),
46            Self::IdentityCard(val) => Some(val.data.as_ref()),
47            Self::InternalPassport(val) => Some(val.data.as_ref()),
48            Self::Address(val) => Some(val.data.as_ref()),
49            _ => None,
50        }
51    }
52
53    /// Helper method for field `email`.
54    ///
55    /// User's verified email address; available only for `email` type
56    #[must_use]
57    pub fn email(&self) -> Option<&str> {
58        match self {
59            Self::Email(val) => Some(val.email.as_ref()),
60            _ => None,
61        }
62    }
63
64    /// Helper method for field `files`.
65    ///
66    /// Array of encrypted files with documents provided by the user; available only for `utility_bill`, `bank_statement`, `rental_agreement`, `passport_registration` and `temporary_registration` types. Files can be decrypted and verified using the accompanying [`crate::types::EncryptedCredentials`].
67    #[must_use]
68    pub fn files(&self) -> Option<&[crate::types::PassportFile]> {
69        match self {
70            Self::UtilityBill(val) => Some(val.files.as_ref()),
71            Self::BankStatement(val) => Some(val.files.as_ref()),
72            Self::RentalAgreement(val) => Some(val.files.as_ref()),
73            Self::PassportRegistration(val) => Some(val.files.as_ref()),
74            Self::TemporaryRegistration(val) => Some(val.files.as_ref()),
75            _ => None,
76        }
77    }
78
79    /// Helper method for field `front_side`.
80    ///
81    /// Encrypted file with the front side of the document, provided by the user; available only for `passport`, `driver_license`, `identity_card` and `internal_passport`. The file can be decrypted and verified using the accompanying [`crate::types::EncryptedCredentials`].
82    #[must_use]
83    pub fn front_side(&self) -> Option<&crate::types::PassportFile> {
84        match self {
85            Self::Passport(val) => Some(&val.front_side),
86            Self::DriverLicense(val) => Some(&val.front_side),
87            Self::IdentityCard(val) => Some(&val.front_side),
88            Self::InternalPassport(val) => Some(&val.front_side),
89            _ => None,
90        }
91    }
92
93    /// Helper method for field `hash`.
94    ///
95    /// Base64-encoded element hash for using in [`crate::types::PassportElementErrorUnspecified`]
96    #[must_use]
97    pub fn hash(&self) -> &str {
98        match self {
99            Self::PersonalDetails(val) => val.hash.as_ref(),
100            Self::Passport(val) => val.hash.as_ref(),
101            Self::DriverLicense(val) => val.hash.as_ref(),
102            Self::IdentityCard(val) => val.hash.as_ref(),
103            Self::InternalPassport(val) => val.hash.as_ref(),
104            Self::Address(val) => val.hash.as_ref(),
105            Self::UtilityBill(val) => val.hash.as_ref(),
106            Self::BankStatement(val) => val.hash.as_ref(),
107            Self::RentalAgreement(val) => val.hash.as_ref(),
108            Self::PassportRegistration(val) => val.hash.as_ref(),
109            Self::TemporaryRegistration(val) => val.hash.as_ref(),
110            Self::PhoneNumber(val) => val.hash.as_ref(),
111            Self::Email(val) => val.hash.as_ref(),
112        }
113    }
114
115    /// Helper method for field `phone_number`.
116    ///
117    /// User's verified phone number; available only for `phone_number` type
118    #[must_use]
119    pub fn phone_number(&self) -> Option<&str> {
120        match self {
121            Self::PhoneNumber(val) => Some(val.phone_number.as_ref()),
122            _ => None,
123        }
124    }
125
126    /// Helper method for field `reverse_side`.
127    ///
128    /// Encrypted file with the reverse side of the document, provided by the user; available only for `driver_license` and `identity_card`. The file can be decrypted and verified using the accompanying [`crate::types::EncryptedCredentials`].
129    #[must_use]
130    pub fn reverse_side(&self) -> Option<&crate::types::PassportFile> {
131        match self {
132            Self::DriverLicense(val) => Some(&val.reverse_side),
133            Self::IdentityCard(val) => Some(&val.reverse_side),
134            _ => None,
135        }
136    }
137
138    /// Helper method for field `selfie`.
139    ///
140    /// Encrypted file with the selfie of the user holding a document, provided by the user; available if requested for `passport`, `driver_license`, `identity_card` and `internal_passport`. The file can be decrypted and verified using the accompanying [`crate::types::EncryptedCredentials`].
141    #[must_use]
142    pub fn selfie(&self) -> Option<&crate::types::PassportFile> {
143        match self {
144            Self::Passport(val) => Some(&val.selfie),
145            Self::DriverLicense(val) => Some(&val.selfie),
146            Self::IdentityCard(val) => Some(&val.selfie),
147            Self::InternalPassport(val) => Some(&val.selfie),
148            _ => None,
149        }
150    }
151
152    /// Helper method for field `translation`.
153    ///
154    /// Array of encrypted files with translated versions of documents provided by the user; available if requested for `passport`, `driver_license`, `identity_card`, `internal_passport`, `utility_bill`, `bank_statement`, `rental_agreement`, `passport_registration` and `temporary_registration` types. Files can be decrypted and verified using the accompanying [`crate::types::EncryptedCredentials`].
155    #[must_use]
156    pub fn translation(&self) -> Option<&[crate::types::PassportFile]> {
157        match self {
158            Self::Passport(val) => Some(val.translation.as_ref()),
159            Self::DriverLicense(val) => Some(val.translation.as_ref()),
160            Self::IdentityCard(val) => Some(val.translation.as_ref()),
161            Self::InternalPassport(val) => Some(val.translation.as_ref()),
162            Self::UtilityBill(val) => Some(val.translation.as_ref()),
163            Self::BankStatement(val) => Some(val.translation.as_ref()),
164            Self::RentalAgreement(val) => Some(val.translation.as_ref()),
165            Self::PassportRegistration(val) => Some(val.translation.as_ref()),
166            Self::TemporaryRegistration(val) => Some(val.translation.as_ref()),
167            _ => None,
168        }
169    }
170}
171impl From<crate::types::EncryptedPassportElementPersonalDetails> for EncryptedPassportElement {
172    fn from(val: crate::types::EncryptedPassportElementPersonalDetails) -> Self {
173        Self::PersonalDetails(val)
174    }
175}
176impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementPersonalDetails {
177    type Error = crate::errors::ConvertToTypeError;
178
179    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
180        if let EncryptedPassportElement::PersonalDetails(inner) = val {
181            Ok(inner)
182        } else {
183            Err(Self::Error::new(
184                stringify!(EncryptedPassportElement),
185                stringify!(EncryptedPassportElementPersonalDetails),
186            ))
187        }
188    }
189}
190impl From<crate::types::EncryptedPassportElementPassport> for EncryptedPassportElement {
191    fn from(val: crate::types::EncryptedPassportElementPassport) -> Self {
192        Self::Passport(val)
193    }
194}
195impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementPassport {
196    type Error = crate::errors::ConvertToTypeError;
197
198    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
199        if let EncryptedPassportElement::Passport(inner) = val {
200            Ok(inner)
201        } else {
202            Err(Self::Error::new(
203                stringify!(EncryptedPassportElement),
204                stringify!(EncryptedPassportElementPassport),
205            ))
206        }
207    }
208}
209impl From<crate::types::EncryptedPassportElementDriverLicense> for EncryptedPassportElement {
210    fn from(val: crate::types::EncryptedPassportElementDriverLicense) -> Self {
211        Self::DriverLicense(val)
212    }
213}
214impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementDriverLicense {
215    type Error = crate::errors::ConvertToTypeError;
216
217    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
218        if let EncryptedPassportElement::DriverLicense(inner) = val {
219            Ok(inner)
220        } else {
221            Err(Self::Error::new(
222                stringify!(EncryptedPassportElement),
223                stringify!(EncryptedPassportElementDriverLicense),
224            ))
225        }
226    }
227}
228impl From<crate::types::EncryptedPassportElementIdentityCard> for EncryptedPassportElement {
229    fn from(val: crate::types::EncryptedPassportElementIdentityCard) -> Self {
230        Self::IdentityCard(val)
231    }
232}
233impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementIdentityCard {
234    type Error = crate::errors::ConvertToTypeError;
235
236    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
237        if let EncryptedPassportElement::IdentityCard(inner) = val {
238            Ok(inner)
239        } else {
240            Err(Self::Error::new(
241                stringify!(EncryptedPassportElement),
242                stringify!(EncryptedPassportElementIdentityCard),
243            ))
244        }
245    }
246}
247impl From<crate::types::EncryptedPassportElementInternalPassport> for EncryptedPassportElement {
248    fn from(val: crate::types::EncryptedPassportElementInternalPassport) -> Self {
249        Self::InternalPassport(val)
250    }
251}
252impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementInternalPassport {
253    type Error = crate::errors::ConvertToTypeError;
254
255    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
256        if let EncryptedPassportElement::InternalPassport(inner) = val {
257            Ok(inner)
258        } else {
259            Err(Self::Error::new(
260                stringify!(EncryptedPassportElement),
261                stringify!(EncryptedPassportElementInternalPassport),
262            ))
263        }
264    }
265}
266impl From<crate::types::EncryptedPassportElementAddress> for EncryptedPassportElement {
267    fn from(val: crate::types::EncryptedPassportElementAddress) -> Self {
268        Self::Address(val)
269    }
270}
271impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementAddress {
272    type Error = crate::errors::ConvertToTypeError;
273
274    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
275        if let EncryptedPassportElement::Address(inner) = val {
276            Ok(inner)
277        } else {
278            Err(Self::Error::new(
279                stringify!(EncryptedPassportElement),
280                stringify!(EncryptedPassportElementAddress),
281            ))
282        }
283    }
284}
285impl From<crate::types::EncryptedPassportElementUtilityBill> for EncryptedPassportElement {
286    fn from(val: crate::types::EncryptedPassportElementUtilityBill) -> Self {
287        Self::UtilityBill(val)
288    }
289}
290impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementUtilityBill {
291    type Error = crate::errors::ConvertToTypeError;
292
293    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
294        if let EncryptedPassportElement::UtilityBill(inner) = val {
295            Ok(inner)
296        } else {
297            Err(Self::Error::new(
298                stringify!(EncryptedPassportElement),
299                stringify!(EncryptedPassportElementUtilityBill),
300            ))
301        }
302    }
303}
304impl From<crate::types::EncryptedPassportElementBankStatement> for EncryptedPassportElement {
305    fn from(val: crate::types::EncryptedPassportElementBankStatement) -> Self {
306        Self::BankStatement(val)
307    }
308}
309impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementBankStatement {
310    type Error = crate::errors::ConvertToTypeError;
311
312    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
313        if let EncryptedPassportElement::BankStatement(inner) = val {
314            Ok(inner)
315        } else {
316            Err(Self::Error::new(
317                stringify!(EncryptedPassportElement),
318                stringify!(EncryptedPassportElementBankStatement),
319            ))
320        }
321    }
322}
323impl From<crate::types::EncryptedPassportElementRentalAgreement> for EncryptedPassportElement {
324    fn from(val: crate::types::EncryptedPassportElementRentalAgreement) -> Self {
325        Self::RentalAgreement(val)
326    }
327}
328impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementRentalAgreement {
329    type Error = crate::errors::ConvertToTypeError;
330
331    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
332        if let EncryptedPassportElement::RentalAgreement(inner) = val {
333            Ok(inner)
334        } else {
335            Err(Self::Error::new(
336                stringify!(EncryptedPassportElement),
337                stringify!(EncryptedPassportElementRentalAgreement),
338            ))
339        }
340    }
341}
342impl From<crate::types::EncryptedPassportElementPassportRegistration> for EncryptedPassportElement {
343    fn from(val: crate::types::EncryptedPassportElementPassportRegistration) -> Self {
344        Self::PassportRegistration(val)
345    }
346}
347impl TryFrom<EncryptedPassportElement>
348    for crate::types::EncryptedPassportElementPassportRegistration
349{
350    type Error = crate::errors::ConvertToTypeError;
351
352    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
353        if let EncryptedPassportElement::PassportRegistration(inner) = val {
354            Ok(inner)
355        } else {
356            Err(Self::Error::new(
357                stringify!(EncryptedPassportElement),
358                stringify!(EncryptedPassportElementPassportRegistration),
359            ))
360        }
361    }
362}
363impl From<crate::types::EncryptedPassportElementTemporaryRegistration>
364    for EncryptedPassportElement
365{
366    fn from(val: crate::types::EncryptedPassportElementTemporaryRegistration) -> Self {
367        Self::TemporaryRegistration(val)
368    }
369}
370impl TryFrom<EncryptedPassportElement>
371    for crate::types::EncryptedPassportElementTemporaryRegistration
372{
373    type Error = crate::errors::ConvertToTypeError;
374
375    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
376        if let EncryptedPassportElement::TemporaryRegistration(inner) = val {
377            Ok(inner)
378        } else {
379            Err(Self::Error::new(
380                stringify!(EncryptedPassportElement),
381                stringify!(EncryptedPassportElementTemporaryRegistration),
382            ))
383        }
384    }
385}
386impl From<crate::types::EncryptedPassportElementPhoneNumber> for EncryptedPassportElement {
387    fn from(val: crate::types::EncryptedPassportElementPhoneNumber) -> Self {
388        Self::PhoneNumber(val)
389    }
390}
391impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementPhoneNumber {
392    type Error = crate::errors::ConvertToTypeError;
393
394    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
395        if let EncryptedPassportElement::PhoneNumber(inner) = val {
396            Ok(inner)
397        } else {
398            Err(Self::Error::new(
399                stringify!(EncryptedPassportElement),
400                stringify!(EncryptedPassportElementPhoneNumber),
401            ))
402        }
403    }
404}
405impl From<crate::types::EncryptedPassportElementEmail> for EncryptedPassportElement {
406    fn from(val: crate::types::EncryptedPassportElementEmail) -> Self {
407        Self::Email(val)
408    }
409}
410impl TryFrom<EncryptedPassportElement> for crate::types::EncryptedPassportElementEmail {
411    type Error = crate::errors::ConvertToTypeError;
412
413    fn try_from(val: EncryptedPassportElement) -> Result<Self, Self::Error> {
414        if let EncryptedPassportElement::Email(inner) = val {
415            Ok(inner)
416        } else {
417            Err(Self::Error::new(
418                stringify!(EncryptedPassportElement),
419                stringify!(EncryptedPassportElementEmail),
420            ))
421        }
422    }
423}