use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use super::common::{ApiErrorCode, CallInitiator};
use super::ip_address::IpAddress;
use super::org_number::OrgNumber;
use super::ssn::Pno;
use super::url::Url;
#[must_use]
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSeAuthRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub ssn: Option<Pno>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ip_address: Option<IpAddress>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<Url>,
pub pin_required: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub intent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub org_number: Option<OrgNumber>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl BankIdSeAuthRequest {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn ssn(mut self, ssn: Pno) -> Self {
self.ssn = Some(ssn);
self
}
#[inline]
pub fn ip_address(mut self, ip: IpAddress) -> Self {
self.ip_address = Some(ip);
self
}
#[inline]
pub fn callback_url(mut self, url: Url) -> Self {
self.callback_url = Some(url);
self
}
#[inline]
pub fn pin_required(mut self, required: bool) -> Self {
self.pin_required = required;
self
}
#[inline]
pub fn intent(mut self, intent: impl Into<String>) -> Self {
self.intent = Some(intent.into());
self
}
#[inline]
pub fn org_number(mut self, org_number: OrgNumber) -> Self {
self.org_number = Some(org_number);
self
}
#[inline]
pub fn request_address(mut self, request: bool) -> Self {
self.request_address = Some(request);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[must_use]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSeSignRequest {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub ssn: Option<Pno>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ip_address: Option<IpAddress>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<Url>,
pub pin_required: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub digest: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub org_number: Option<OrgNumber>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl BankIdSeSignRequest {
#[inline]
pub fn new(text: impl Into<String>) -> Self {
Self {
text: text.into(),
ssn: None,
ip_address: None,
callback_url: None,
pin_required: false,
digest: None,
org_number: None,
request_address: None,
ref_id: None,
}
}
#[inline]
pub fn ssn(mut self, ssn: Pno) -> Self {
self.ssn = Some(ssn);
self
}
#[inline]
pub fn ip_address(mut self, ip: IpAddress) -> Self {
self.ip_address = Some(ip);
self
}
#[inline]
pub fn callback_url(mut self, url: Url) -> Self {
self.callback_url = Some(url);
self
}
#[inline]
pub fn pin_required(mut self, required: bool) -> Self {
self.pin_required = required;
self
}
#[inline]
pub fn digest(mut self, digest: impl Into<String>) -> Self {
self.digest = Some(digest.into());
self
}
#[inline]
pub fn org_number(mut self, org_number: OrgNumber) -> Self {
self.org_number = Some(org_number);
self
}
#[inline]
pub fn request_address(mut self, request: bool) -> Self {
self.request_address = Some(request);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[must_use]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSePhoneAuthRequest {
pub ssn: Pno,
pub call_initiator: CallInitiator,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<Url>,
pub pin_required: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub intent: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub org_number: Option<OrgNumber>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl BankIdSePhoneAuthRequest {
#[inline]
pub fn new(ssn: Pno, call_initiator: CallInitiator) -> Self {
Self {
ssn,
call_initiator,
callback_url: None,
pin_required: false,
intent: None,
org_number: None,
request_address: None,
ref_id: None,
}
}
#[inline]
pub fn callback_url(mut self, url: Url) -> Self {
self.callback_url = Some(url);
self
}
#[inline]
pub fn pin_required(mut self, required: bool) -> Self {
self.pin_required = required;
self
}
#[inline]
pub fn intent(mut self, intent: impl Into<String>) -> Self {
self.intent = Some(intent.into());
self
}
#[inline]
pub fn org_number(mut self, org_number: OrgNumber) -> Self {
self.org_number = Some(org_number);
self
}
#[inline]
pub fn request_address(mut self, request: bool) -> Self {
self.request_address = Some(request);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[must_use]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSePhoneSignRequest {
pub ssn: Pno,
pub call_initiator: CallInitiator,
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<Url>,
pub pin_required: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub digest: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub org_number: Option<OrgNumber>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl BankIdSePhoneSignRequest {
pub fn new(ssn: Pno, call_initiator: CallInitiator, text: impl Into<String>) -> Self {
Self {
ssn,
call_initiator,
text: text.into(),
callback_url: None,
pin_required: false,
digest: None,
org_number: None,
request_address: None,
ref_id: None,
}
}
pub fn callback_url(mut self, url: Url) -> Self {
self.callback_url = Some(url);
self
}
pub fn pin_required(mut self, required: bool) -> Self {
self.pin_required = required;
self
}
pub fn digest(mut self, digest: impl Into<String>) -> Self {
self.digest = Some(digest.into());
self
}
pub fn org_number(mut self, org_number: OrgNumber) -> Self {
self.org_number = Some(org_number);
self
}
pub fn request_address(mut self, request: bool) -> Self {
self.request_address = Some(request);
self
}
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSeVerifyRequest {
pub qr_code: String,
}
impl BankIdSeVerifyRequest {
pub fn new(qr_code: impl Into<String>) -> Self {
Self {
qr_code: qr_code.into(),
}
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "status")]
pub enum BankIdSeStatus {
#[serde(rename = "PENDING")]
Pending(BankIdSePending),
#[serde(rename = "COMPLETED")]
Completed(BankIdSeCompleted),
#[serde(rename = "FAILED")]
Failed(BankIdSeFailed),
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSePending {
pub id: String,
pub ref_id: Option<String>,
pub auto_start_token: Option<String>,
pub qr_start_token: Option<String>,
pub qr_start_secret: Option<String>,
pub hint_code: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSeCompleted {
pub id: String,
pub ref_id: Option<String>,
pub ssn: Pno,
pub name: String,
pub given_name: String,
pub surname: String,
pub cert_start_date: Option<NaiveDate>,
pub address: Option<String>,
pub company_signatory_text: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSeFailed {
pub id: String,
pub ref_id: Option<String>,
pub error: ApiErrorCode,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BankIdSeVerifyResponse {
pub ssn: Pno,
pub name: String,
pub given_name: String,
pub surname: String,
pub age: Option<u8>,
pub verified_at: Option<NaiveDate>,
}