use crate::types::{Eci, MessageVersion, TransStatus, TransStatusReason};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AuthenticationResponse {
pub message_type: MessageType,
pub message_version: MessageVersion,
#[serde(rename = "threeDSServerTransID")]
pub three_ds_server_trans_id: String,
#[serde(rename = "acsTransID")]
pub acs_trans_id: String,
#[serde(rename = "dsTransID")]
pub ds_trans_id: String,
pub trans_status: TransStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub trans_status_reason: Option<TransStatusReason>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acs_challenge_mandated: Option<AcsMandated>,
#[serde(skip_serializing_if = "Option::is_none")]
pub eci: Option<Eci>,
#[serde(skip_serializing_if = "Option::is_none")]
pub authentication_value: Option<String>,
#[serde(rename = "acsURL", skip_serializing_if = "Option::is_none")]
pub acs_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acs_signed_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acs_dec_con_ind: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acs_reference_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ds_reference_number: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cardholder_info: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub whitelist_status: Option<WhitelistStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub whitelist_status_source: Option<WhitelistStatusSource>,
}
impl AuthenticationResponse {
pub fn is_frictionless(&self) -> bool {
self.trans_status.is_authenticated()
}
pub fn requires_challenge(&self) -> bool {
self.trans_status.requires_challenge()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum MessageType {
ARes,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AcsMandated {
#[serde(rename = "Y")]
Yes,
#[serde(rename = "N")]
No,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WhitelistStatus {
#[serde(rename = "Y")]
Whitelisted,
#[serde(rename = "N")]
NotWhitelisted,
#[serde(rename = "E")]
NotEligible,
#[serde(rename = "P")]
Pending,
#[serde(rename = "R")]
RequestedByRequestor,
#[serde(rename = "U")]
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum WhitelistStatusSource {
#[serde(rename = "01")]
ThreeDsServerCached,
#[serde(rename = "02")]
Ds,
#[serde(rename = "03")]
Acs,
}