use serde_derive::{Deserialize, Serialize};
use crate::ids::IdentityVerificationSessionId;
use crate::params::{Expandable, Metadata, Object, Timestamp};
use crate::resources::{Address, IdentityVerificationReport};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct IdentityVerificationSession {
pub id: IdentityVerificationSessionId,
#[serde(skip_serializing_if = "Option::is_none")]
pub client_secret: Option<Box<String>>,
pub created: Timestamp,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_error: Option<Box<GelatoSessionLastError>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_verification_report: Option<Box<Expandable<IdentityVerificationReport>>>,
pub livemode: bool,
pub metadata: Metadata,
pub options: GelatoVerificationSessionOptions,
#[serde(skip_serializing_if = "Option::is_none")]
pub redaction: Option<Box<VerificationSessionRedaction>>,
pub status: IdentityVerificationSessionStatus,
#[serde(rename = "type")]
pub type_: IdentityVerificationSessionType,
#[serde(skip_serializing_if = "Option::is_none")]
pub url: Option<Box<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub verified_outputs: Option<Box<GelatoVerifiedOutputs>>,
}
impl Object for IdentityVerificationSession {
type Id = IdentityVerificationSessionId;
fn id(&self) -> Self::Id {
self.id.clone()
}
fn object(&self) -> &'static str {
"identity.verification_session"
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GelatoSessionLastError {
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<Box<GelatoSessionLastErrorCode>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<Box<String>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GelatoVerificationSessionOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub document: Option<Box<GelatoSessionDocumentOptions>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_number: Option<Box<GelatoSessionIdNumberOptions>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GelatoSessionDocumentOptions {
#[serde(skip_serializing_if = "Option::is_none")]
pub allowed_types: Option<Box<Vec<GelatoSessionDocumentOptionsAllowedTypes>>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_id_number: Option<Box<bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_live_capture: Option<Box<bool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub require_matching_selfie: Option<Box<bool>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GelatoSessionIdNumberOptions {}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GelatoVerifiedOutputs {
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<Box<Address>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub dob: Option<Box<GelatoDataVerifiedOutputsDate>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<Box<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_number: Option<Box<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub id_number_type: Option<Box<GelatoVerifiedOutputsIdNumberType>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<Box<String>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct GelatoDataVerifiedOutputsDate {
#[serde(skip_serializing_if = "Option::is_none")]
pub day: Option<Box<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub month: Option<Box<i64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub year: Option<Box<i64>>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct VerificationSessionRedaction {
pub status: VerificationSessionRedactionStatus,
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum GelatoSessionDocumentOptionsAllowedTypes {
DrivingLicense,
IdCard,
Passport,
}
impl GelatoSessionDocumentOptionsAllowedTypes {
pub fn as_str(self) -> &'static str {
match self {
GelatoSessionDocumentOptionsAllowedTypes::DrivingLicense => "driving_license",
GelatoSessionDocumentOptionsAllowedTypes::IdCard => "id_card",
GelatoSessionDocumentOptionsAllowedTypes::Passport => "passport",
}
}
}
impl AsRef<str> for GelatoSessionDocumentOptionsAllowedTypes {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for GelatoSessionDocumentOptionsAllowedTypes {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum GelatoSessionLastErrorCode {
Abandoned,
ConsentDeclined,
CountryNotSupported,
DeviceNotSupported,
DocumentExpired,
DocumentTypeNotSupported,
DocumentUnverifiedOther,
IdNumberInsufficientDocumentData,
IdNumberMismatch,
IdNumberUnverifiedOther,
SelfieDocumentMissingPhoto,
SelfieFaceMismatch,
SelfieManipulated,
SelfieUnverifiedOther,
UnderSupportedAge,
}
impl GelatoSessionLastErrorCode {
pub fn as_str(self) -> &'static str {
match self {
GelatoSessionLastErrorCode::Abandoned => "abandoned",
GelatoSessionLastErrorCode::ConsentDeclined => "consent_declined",
GelatoSessionLastErrorCode::CountryNotSupported => "country_not_supported",
GelatoSessionLastErrorCode::DeviceNotSupported => "device_not_supported",
GelatoSessionLastErrorCode::DocumentExpired => "document_expired",
GelatoSessionLastErrorCode::DocumentTypeNotSupported => "document_type_not_supported",
GelatoSessionLastErrorCode::DocumentUnverifiedOther => "document_unverified_other",
GelatoSessionLastErrorCode::IdNumberInsufficientDocumentData => {
"id_number_insufficient_document_data"
}
GelatoSessionLastErrorCode::IdNumberMismatch => "id_number_mismatch",
GelatoSessionLastErrorCode::IdNumberUnverifiedOther => "id_number_unverified_other",
GelatoSessionLastErrorCode::SelfieDocumentMissingPhoto => {
"selfie_document_missing_photo"
}
GelatoSessionLastErrorCode::SelfieFaceMismatch => "selfie_face_mismatch",
GelatoSessionLastErrorCode::SelfieManipulated => "selfie_manipulated",
GelatoSessionLastErrorCode::SelfieUnverifiedOther => "selfie_unverified_other",
GelatoSessionLastErrorCode::UnderSupportedAge => "under_supported_age",
}
}
}
impl AsRef<str> for GelatoSessionLastErrorCode {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for GelatoSessionLastErrorCode {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum GelatoVerifiedOutputsIdNumberType {
BrCpf,
SgNric,
UsSsn,
}
impl GelatoVerifiedOutputsIdNumberType {
pub fn as_str(self) -> &'static str {
match self {
GelatoVerifiedOutputsIdNumberType::BrCpf => "br_cpf",
GelatoVerifiedOutputsIdNumberType::SgNric => "sg_nric",
GelatoVerifiedOutputsIdNumberType::UsSsn => "us_ssn",
}
}
}
impl AsRef<str> for GelatoVerifiedOutputsIdNumberType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for GelatoVerifiedOutputsIdNumberType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IdentityVerificationSessionStatus {
Canceled,
Processing,
RequiresInput,
Verified,
}
impl IdentityVerificationSessionStatus {
pub fn as_str(self) -> &'static str {
match self {
IdentityVerificationSessionStatus::Canceled => "canceled",
IdentityVerificationSessionStatus::Processing => "processing",
IdentityVerificationSessionStatus::RequiresInput => "requires_input",
IdentityVerificationSessionStatus::Verified => "verified",
}
}
}
impl AsRef<str> for IdentityVerificationSessionStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IdentityVerificationSessionStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum IdentityVerificationSessionType {
Document,
IdNumber,
}
impl IdentityVerificationSessionType {
pub fn as_str(self) -> &'static str {
match self {
IdentityVerificationSessionType::Document => "document",
IdentityVerificationSessionType::IdNumber => "id_number",
}
}
}
impl AsRef<str> for IdentityVerificationSessionType {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for IdentityVerificationSessionType {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}
#[derive(Copy, Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum VerificationSessionRedactionStatus {
Processing,
Redacted,
}
impl VerificationSessionRedactionStatus {
pub fn as_str(self) -> &'static str {
match self {
VerificationSessionRedactionStatus::Processing => "processing",
VerificationSessionRedactionStatus::Redacted => "redacted",
}
}
}
impl AsRef<str> for VerificationSessionRedactionStatus {
fn as_ref(&self) -> &str {
self.as_str()
}
}
impl std::fmt::Display for VerificationSessionRedactionStatus {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
self.as_str().fmt(f)
}
}