use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MessageVersion {
#[serde(rename = "2.1.0")]
V210,
#[serde(rename = "2.2.0")]
V220,
#[serde(rename = "2.3.0")]
V230,
}
impl MessageVersion {
pub fn as_str(self) -> &'static str {
match self {
Self::V210 => "2.1.0",
Self::V220 => "2.2.0",
Self::V230 => "2.3.0",
}
}
}
impl std::fmt::Display for MessageVersion {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_str())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DeviceChannel {
#[serde(rename = "01")]
App,
#[serde(rename = "02")]
Browser,
#[serde(rename = "03")]
ThreeDsRequestorInitiated,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum MessageCategory {
#[serde(rename = "01")]
PaymentAuthentication,
#[serde(rename = "02")]
NonPaymentAuthentication,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TransStatus {
#[serde(rename = "Y")]
Success,
#[serde(rename = "N")]
Failure,
#[serde(rename = "U")]
Unable,
#[serde(rename = "A")]
Attempted,
#[serde(rename = "C")]
ChallengeRequired,
#[serde(rename = "D")]
DecoupledRequired,
#[serde(rename = "I")]
InformationalOnly,
#[serde(rename = "R")]
Rejected,
}
impl TransStatus {
pub fn is_authenticated(self) -> bool {
matches!(self, Self::Success | Self::Attempted)
}
pub fn requires_challenge(self) -> bool {
matches!(self, Self::ChallengeRequired | Self::DecoupledRequired)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TransStatusReason {
#[serde(rename = "01")]
CardAuthenticationFailed,
#[serde(rename = "02")]
UnknownDevice,
#[serde(rename = "03")]
UnsupportedDevice,
#[serde(rename = "04")]
ExceedsAuthenticationFrequencyLimit,
#[serde(rename = "05")]
ExpiredCard,
#[serde(rename = "06")]
InvalidCardNumber,
#[serde(rename = "07")]
InvalidTransaction,
#[serde(rename = "08")]
NoCardRecord,
#[serde(rename = "09")]
SecurityFailure,
#[serde(rename = "10")]
StolenCard,
#[serde(rename = "11")]
SuspectedFraud,
#[serde(rename = "12")]
TransactionNotPermittedToCardholder,
#[serde(rename = "13")]
CardholderNotEnrolledInService,
#[serde(rename = "14")]
TransactionTimedOutAtAcs,
#[serde(rename = "15")]
LowConfidence,
#[serde(rename = "16")]
MediumConfidence,
#[serde(rename = "17")]
HighConfidence,
#[serde(rename = "18")]
VeryHighConfidence,
#[serde(rename = "19")]
ExceedsMaxChallengesPerTransaction,
#[serde(rename = "20")]
NonPaymentNotSupported,
#[serde(rename = "21")]
ThreeDsRequestorChallengeIndicator3NotAccepted,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum Eci {
#[serde(rename = "05")]
VisaFullyAuthenticated,
#[serde(rename = "06")]
VisaAttempted,
#[serde(rename = "07")]
VisaNotAuthenticated,
#[serde(rename = "02")]
MastercardFullyAuthenticated,
#[serde(rename = "01")]
MastercardAttempted,
#[serde(rename = "00")]
MastercardNotAuthenticated,
}
impl Eci {
pub fn has_liability_shift(self) -> bool {
matches!(
self,
Self::VisaFullyAuthenticated
| Self::VisaAttempted
| Self::MastercardFullyAuthenticated
| Self::MastercardAttempted
)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ChallengeIndicator {
#[serde(rename = "01")]
NoPreference,
#[serde(rename = "02")]
NoChallengeRequested,
#[serde(rename = "03")]
ChallengeRequested,
#[serde(rename = "04")]
ChallengeRequestedMandate,
#[serde(rename = "05")]
NoChallengeRiskAnalysisPerformed,
#[serde(rename = "06")]
NoChallengeDataShareOnly,
#[serde(rename = "07")]
NoChallengeSCAAlreadyPerformed,
#[serde(rename = "08")]
NoChallengeWhitelisted,
#[serde(rename = "09")]
ChallengeRequestedWhitelistPrompt,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ChallengeWindowSize {
#[serde(rename = "01")]
W250x400,
#[serde(rename = "02")]
W390x400,
#[serde(rename = "03")]
W500x600,
#[serde(rename = "04")]
W600x400,
#[serde(rename = "05")]
FullScreen,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ThreeDsMethod {
#[serde(rename = "00")]
NotAvailableOrNotUsed,
#[serde(rename = "01")]
Successful,
#[serde(rename = "02")]
Failed,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AuthenticationMethod {
#[serde(rename = "01")]
NoThreeDsRequestorAuthentication,
#[serde(rename = "02")]
LoginToRequestorAccount,
#[serde(rename = "03")]
FederatedId,
#[serde(rename = "04")]
IssuerCredentials,
#[serde(rename = "05")]
ThirdPartyAuthentication,
#[serde(rename = "06")]
FidoAuthenticator,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum DeliveryTimeframe {
#[serde(rename = "01")]
ElectronicDelivery,
#[serde(rename = "02")]
SameDayShipping,
#[serde(rename = "03")]
OvernightShipping,
#[serde(rename = "04")]
TwoDayOrMoreShipping,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ShipIndicator {
#[serde(rename = "01")]
ShipToCardholdersBillingAddress,
#[serde(rename = "02")]
ShipToAnotherVerifiedAddress,
#[serde(rename = "03")]
ShipToDifferentAddress,
#[serde(rename = "04")]
ShipToStore,
#[serde(rename = "05")]
DigitalGoods,
#[serde(rename = "06")]
NotShipped,
#[serde(rename = "07")]
Other,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ReorderItemsIndicator {
#[serde(rename = "01")]
FirstTimeOrdered,
#[serde(rename = "02")]
Reordered,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PreOrderPurchaseIndicator {
#[serde(rename = "01")]
MerchandiseAvailable,
#[serde(rename = "02")]
FutureAvailability,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum SuspiciousAccActivity {
#[serde(rename = "01")]
NoSuspiciousActivity,
#[serde(rename = "02")]
SuspiciousActivityObserved,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ActionIndicator {
#[serde(rename = "A")]
Add,
#[serde(rename = "M")]
Modify,
#[serde(rename = "D")]
Delete,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AcsAuthMethod {
#[serde(rename = "01")]
NoAuthentication,
#[serde(rename = "02")]
SmsOtp,
#[serde(rename = "03")]
KnowledgeBased,
#[serde(rename = "04")]
Oob,
#[serde(rename = "05")]
Cvc2,
#[serde(rename = "06")]
ThreeDsServerProprietary,
#[serde(rename = "07")]
RiskBased,
#[serde(rename = "08")]
DigitalToken,
#[serde(rename = "09")]
PushNotification,
#[serde(rename = "10")]
Biometric,
#[serde(rename = "11")]
FidoAssertion,
#[serde(rename = "12")]
AppBased,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum AuthenticationType {
#[serde(rename = "01")]
Frictionless,
#[serde(rename = "02")]
ChallengeOtp,
#[serde(rename = "03")]
ChallengeOob,
#[serde(rename = "04")]
ChallengeRba,
#[serde(rename = "05")]
ChallengeAcsDecision,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum ResultsStatus {
#[serde(rename = "01")]
Received,
#[serde(rename = "02")]
OutOfSync,
}