1use crate::types::{MessageVersion, TransStatus};
2use serde::{Deserialize, Serialize};
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct ChallengeResponse {
12 pub message_type: MessageType,
13 pub message_version: MessageVersion,
14 #[serde(rename = "threeDSServerTransID")]
15 pub three_ds_server_trans_id: String,
16 #[serde(rename = "acsTransID")]
17 pub acs_trans_id: String,
18 pub trans_status: TransStatus,
20 pub challenge_completion_ind: CompletionIndicator,
22 #[serde(skip_serializing_if = "Option::is_none")]
24 pub acs_ui: Option<String>,
25 #[serde(skip_serializing_if = "Option::is_none")]
27 pub acs_ui_type: Option<AcsUiType>,
28 #[serde(skip_serializing_if = "Option::is_none")]
30 pub acs_html: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
33 pub whitelist_status: Option<super::ares::WhitelistStatus>,
34}
35
36impl ChallengeResponse {
37 pub fn is_authenticated(&self) -> bool {
39 self.trans_status.is_authenticated()
40 }
41}
42
43#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
44pub enum MessageType {
45 CRes,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
49pub enum CompletionIndicator {
50 #[serde(rename = "Y")]
51 Complete,
52 #[serde(rename = "N")]
53 Incomplete,
54}
55
56#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
57pub enum AcsUiType {
58 #[serde(rename = "01")]
59 Text,
60 #[serde(rename = "02")]
61 SingleSelect,
62 #[serde(rename = "03")]
63 MultiSelect,
64 #[serde(rename = "04")]
65 Oob,
66 #[serde(rename = "05")]
67 HtmlOther,
68}