Skip to main content

emv_3ds/message/
rres.rs

1use crate::types::{MessageVersion, ResultsStatus};
2use serde::{Deserialize, Serialize};
3
4/// EMV 3DS Results Response (RRes).
5///
6/// Sent by the 3DS Server to the ACS to acknowledge receipt of an RReq.
7/// Build with `ResultsResponse::acknowledge(&rreq)` immediately after receiving
8/// an RReq; send before or concurrently with calling `TransactionState::receive_rreq`.
9#[derive(Debug, Clone, Serialize, Deserialize)]
10#[serde(rename_all = "camelCase")]
11pub struct ResultsResponse {
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    #[serde(rename = "dsTransID", skip_serializing_if = "Option::is_none")]
19    pub ds_trans_id: Option<String>,
20    pub results_status: ResultsStatus,
21    #[serde(skip_serializing_if = "Option::is_none")]
22    pub message_extension: Option<Vec<super::rreq::MessageExtension>>,
23}
24
25impl ResultsResponse {
26    /// Build the acknowledgment RRes for a received RReq.
27    pub fn acknowledge(rreq: &super::rreq::ResultsRequest) -> Self {
28        Self {
29            message_type: MessageType::RRes,
30            message_version: rreq.message_version,
31            three_ds_server_trans_id: rreq.three_ds_server_trans_id.clone(),
32            acs_trans_id: rreq.acs_trans_id.clone(),
33            ds_trans_id: rreq.ds_trans_id.clone(),
34            results_status: ResultsStatus::Received,
35            message_extension: None,
36        }
37    }
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
41pub enum MessageType {
42    RRes,
43}