use chrono::NaiveDate;
use serde::{Deserialize, Serialize};
use super::common::ApiErrorCode;
use super::email::Email;
use super::ssn::Nnin;
use super::url::Url;
#[must_use]
#[derive(Debug, Clone, Default, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VippsAuthRequest {
#[serde(skip_serializing_if = "Option::is_none")]
pub redirect_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_ssn: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_phone: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_callback_uri: Option<Url>,
}
impl VippsAuthRequest {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn redirect_url(mut self, url: Url) -> Self {
self.redirect_url = Some(url);
self
}
#[inline]
pub fn request_ssn(mut self, v: bool) -> Self {
self.request_ssn = Some(v);
self
}
#[inline]
pub fn request_phone(mut self, v: bool) -> Self {
self.request_phone = Some(v);
self
}
#[inline]
pub fn request_email(mut self, v: bool) -> Self {
self.request_email = Some(v);
self
}
#[inline]
pub fn request_address(mut self, v: bool) -> Self {
self.request_address = Some(v);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
#[inline]
pub fn app_callback_uri(mut self, uri: Url) -> Self {
self.app_callback_uri = Some(uri);
self
}
}
#[must_use]
#[derive(Debug, Clone, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct VippsBackchannelAuthRequest {
pub phone: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_ssn: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_email: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub request_address: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<Url>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ref_id: Option<String>,
}
impl VippsBackchannelAuthRequest {
#[inline]
pub fn new(phone: impl Into<String>) -> Self {
Self {
phone: phone.into(),
request_ssn: None,
request_email: None,
request_address: None,
callback_url: None,
ref_id: None,
}
}
#[inline]
pub fn request_ssn(mut self, v: bool) -> Self {
self.request_ssn = Some(v);
self
}
#[inline]
pub fn request_email(mut self, v: bool) -> Self {
self.request_email = Some(v);
self
}
#[inline]
pub fn request_address(mut self, v: bool) -> Self {
self.request_address = Some(v);
self
}
#[inline]
pub fn callback_url(mut self, url: Url) -> Self {
self.callback_url = Some(url);
self
}
#[inline]
pub fn ref_id(mut self, ref_id: impl Into<String>) -> Self {
self.ref_id = Some(ref_id.into());
self
}
}
#[non_exhaustive]
#[derive(Debug, Clone, Deserialize)]
#[serde(tag = "status")]
pub enum VippsStatus {
#[serde(rename = "PENDING")]
Pending(VippsPending),
#[serde(rename = "COMPLETED")]
Completed(VippsCompleted),
#[serde(rename = "FAILED")]
Failed(VippsFailed),
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VippsPending {
pub id: String,
pub ref_id: Option<String>,
pub url: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VippsCompleted {
pub id: String,
pub ref_id: Option<String>,
pub ssn: Option<Nnin>,
pub name: String,
pub given_name: String,
pub surname: String,
pub phone: Option<String>,
pub email: Option<Email>,
pub address: Option<String>,
pub birth_date: Option<NaiveDate>,
pub pid: Option<String>,
pub bank_id: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VippsFailed {
pub id: String,
pub ref_id: Option<String>,
pub error: ApiErrorCode,
}