use crate::error::{Error, Result};
use serde::{Deserialize, Deserializer};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestType {
WalletCreation,
AccountCreation,
PinValidation,
PaymentResponse,
IdCardUploadRequired,
SelfieUploadRequired,
SignatureUploadRequired,
AddressUploadRequired,
Other(u8),
}
impl From<u8> for RequestType {
fn from(value: u8) -> Self {
match value {
1 => Self::WalletCreation,
2 => Self::AccountCreation,
3 => Self::PinValidation,
4 => Self::PaymentResponse,
5 => Self::IdCardUploadRequired,
6 => Self::SelfieUploadRequired,
7 => Self::SignatureUploadRequired,
8 => Self::AddressUploadRequired,
n => Self::Other(n),
}
}
}
impl<'de> Deserialize<'de> for RequestType {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(Self::from(u8::deserialize(deserializer)?))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum NubanType {
Account,
Wallet,
Other(u8),
}
impl From<u8> for NubanType {
fn from(value: u8) -> Self {
match value {
1 => Self::Account,
2 => Self::Wallet,
n => Self::Other(n),
}
}
}
impl<'de> Deserialize<'de> for NubanType {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: Deserializer<'de>,
{
Ok(Self::from(u8::deserialize(deserializer)?))
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct Callback {
#[serde(alias = "Title", alias = "title", default)]
pub title: Option<String>,
#[serde(alias = "Message", alias = "message", default)]
pub message: Option<String>,
#[serde(alias = "Data", alias = "data", default)]
pub data: serde_json::Value,
#[serde(alias = "Request", alias = "request", alias = "RequestType", alias = "requestType")]
pub request_type: RequestType,
}
impl Callback {
pub fn data_as<T: serde::de::DeserializeOwned>(&self) -> Result<T> {
serde_json::from_value(self.data.clone()).map_err(|e| Error::Decode {
message: e.to_string(),
body: self.data.to_string(),
})
}
}
#[derive(Debug, Clone, Deserialize)]
pub struct NubanData {
#[serde(alias = "CustomerID", alias = "customerID", alias = "customerId", default)]
pub customer_id: Option<String>,
#[serde(alias = "NUBANName", alias = "nubanName", default)]
pub nuban_name: Option<String>,
#[serde(alias = "NUBAN", alias = "nuban", default)]
pub nuban: Option<String>,
#[serde(alias = "NUBANStatus", alias = "nubanStatus", default)]
pub nuban_status: Option<String>,
#[serde(alias = "NUBANType", alias = "nubanType", default)]
pub nuban_type: Option<NubanType>,
#[serde(alias = "Email", alias = "email", default)]
pub email: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct InformationRejectedData {
#[serde(alias = "CustomerID", alias = "customerID", alias = "customerId", default)]
pub customer_id: Option<String>,
#[serde(alias = "Reason", alias = "reason", default)]
pub reason: Option<String>,
}