use crate::error::Result;
use crate::error::SmartIdClientError;
use crate::models::api::response::SmartIdAPIResponse;
use crate::models::common::CertificateLevel;
use crate::models::interaction::InteractionFlow;
use crate::models::signature::{ResponseSignature, SignatureProtocol};
use serde::{Deserialize, Serialize};
use serde_with::skip_serializing_none;
pub(crate) type SessionResponse = SmartIdAPIResponse<SessionStatusResponse>;
#[skip_serializing_none]
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct SessionStatusResponse {
pub state: SessionState,
pub result: Option<SessionResult>,
pub signature_protocol: Option<SignatureProtocol>,
pub signature: Option<ResponseSignature>,
pub cert: Option<SessionCertificate>,
pub ignored_properties: Option<Vec<String>>,
pub interaction_type_used: Option<InteractionFlow>,
pub device_ip_address: Option<String>,
}
#[skip_serializing_none]
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionCertificate {
pub value: String,
pub certificate_level: CertificateLevel,
}
#[skip_serializing_none]
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SessionResult {
pub end_result: EndResult,
pub document_number: Option<String>,
}
#[allow(non_camel_case_types)]
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[non_exhaustive]
pub enum SessionState {
#[default]
RUNNING,
COMPLETE,
}
#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
#[allow(non_camel_case_types)]
#[non_exhaustive]
pub enum EndResult {
OK,
USER_REFUSED,
USER_REFUSED_INTERACTION,
TIMEOUT,
DOCUMENT_UNUSABLE,
WRONG_VC,
REQUIRED_INTERACTION_NOT_SUPPORTED_BY_APP,
USER_REFUSED_CERT_CHOICE,
USER_REFUSED_DISPLAYTEXTANDPIN,
USER_REFUSED_VC_CHOICE,
USER_REFUSED_CONFIRMATIONMESSAGE,
USER_REFUSED_CONFIRMATIONMESSAGE_WITH_VC_CHOICE,
PROTOCOL_FAILURE,
SERVER_ERROR,
#[default]
UNKNOWN,
}
impl EndResult {
pub fn is_ok(&self) -> Result<()> {
match self {
EndResult::OK => Ok(()),
EndResult::USER_REFUSED => {
Err(SmartIdClientError::UserRefusedVerificationChoiceException)
}
EndResult::TIMEOUT => Err(SmartIdClientError::SessionTimeoutException),
EndResult::DOCUMENT_UNUSABLE => Err(SmartIdClientError::DocumentUnusableException),
EndResult::WRONG_VC => {
Err(SmartIdClientError::UserSelectedWrongVerificationCodeException)
}
EndResult::REQUIRED_INTERACTION_NOT_SUPPORTED_BY_APP => {
Err(SmartIdClientError::RequiredInteractionNotSupportedByAppException)
}
EndResult::USER_REFUSED_CERT_CHOICE => {
Err(SmartIdClientError::UserRefusedCertChoiceException)
}
EndResult::USER_REFUSED_DISPLAYTEXTANDPIN => {
Err(SmartIdClientError::UserRefusedDisplayTextAndPinException)
}
EndResult::USER_REFUSED_VC_CHOICE => {
Err(SmartIdClientError::UserRefusedVerificationChoiceException)
}
EndResult::USER_REFUSED_CONFIRMATIONMESSAGE => {
Err(SmartIdClientError::UserRefusedConfirmationMessageException)
}
EndResult::USER_REFUSED_CONFIRMATIONMESSAGE_WITH_VC_CHOICE => Err(
SmartIdClientError::UserRefusedConfirmationMessageWithVerificationChoiceException,
),
EndResult::PROTOCOL_FAILURE => Err(SmartIdClientError::ProtocolFailureException),
EndResult::SERVER_ERROR => Err(SmartIdClientError::ServerErrorException),
EndResult::UNKNOWN | _ => Err(SmartIdClientError::SmartIdClientException(
"Unknown session end result",
)),
}
}
}
impl From<EndResult> for SmartIdClientError {
fn from(val: EndResult) -> Self {
match val {
EndResult::USER_REFUSED => SmartIdClientError::UserRefusedVerificationChoiceException,
EndResult::TIMEOUT => SmartIdClientError::SessionTimeoutException,
EndResult::DOCUMENT_UNUSABLE => SmartIdClientError::DocumentUnusableException,
EndResult::WRONG_VC => SmartIdClientError::UserSelectedWrongVerificationCodeException,
EndResult::REQUIRED_INTERACTION_NOT_SUPPORTED_BY_APP => {
SmartIdClientError::RequiredInteractionNotSupportedByAppException
}
EndResult::USER_REFUSED_CERT_CHOICE => {
SmartIdClientError::UserRefusedCertChoiceException
}
EndResult::USER_REFUSED_DISPLAYTEXTANDPIN => {
SmartIdClientError::UserRefusedDisplayTextAndPinException
}
EndResult::USER_REFUSED_VC_CHOICE => {
SmartIdClientError::UserRefusedVerificationChoiceException
}
EndResult::USER_REFUSED_CONFIRMATIONMESSAGE => {
SmartIdClientError::UserRefusedConfirmationMessageException
}
EndResult::USER_REFUSED_CONFIRMATIONMESSAGE_WITH_VC_CHOICE => {
SmartIdClientError::UserRefusedConfirmationMessageWithVerificationChoiceException
}
_ => SmartIdClientError::SmartIdClientException("Unknown session end result"),
}
}
}