use serde::{Deserialize, Serialize};
use crate::{BankAccountNumber, ConnectionId, space_separated_strings_as_vec};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum IdentityStatus {
Processing,
Complete,
Error,
}
impl IdentityStatus {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Processing => "PROCESSING",
Self::Complete => "COMPLETE",
Self::Error => "ERROR",
}
}
pub const fn as_bytes(&self) -> &'static [u8] {
self.as_str().as_bytes()
}
}
impl std::str::FromStr for IdentityStatus {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"PROCESSING" => Ok(Self::Processing),
"COMPLETE" => Ok(Self::Complete),
"ERROR" => Ok(Self::Error),
_ => Err(()),
}
}
}
impl std::convert::TryFrom<String> for IdentityStatus {
type Error = ();
fn try_from(value: String) -> Result<Self, ()> {
value.parse()
}
}
impl std::convert::TryFrom<&str> for IdentityStatus {
type Error = ();
fn try_from(value: &str) -> Result<Self, ()> {
value.parse()
}
}
impl std::fmt::Display for IdentityStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Identity {
pub name: String,
pub formatted_account: BankAccountNumber,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub meta: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Address {
#[serde(rename = "type")]
pub kind: AddressKind,
pub value: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub formatted_address: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub place_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub components: Option<AddressComponents>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum AddressKind {
Residential,
Postal,
Unknown,
}
impl AddressKind {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Residential => "RESIDENTIAL",
Self::Postal => "POSTAL",
Self::Unknown => "UNKNOWN",
}
}
pub const fn as_bytes(&self) -> &'static [u8] {
self.as_str().as_bytes()
}
}
impl std::str::FromStr for AddressKind {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"RESIDENTIAL" => Ok(Self::Residential),
"POSTAL" => Ok(Self::Postal),
"UNKNOWN" => Ok(Self::Unknown),
_ => Err(()),
}
}
}
impl std::convert::TryFrom<String> for AddressKind {
type Error = ();
fn try_from(value: String) -> Result<Self, Self::Error> {
value.parse()
}
}
impl std::convert::TryFrom<&str> for AddressKind {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
value.parse()
}
}
impl std::fmt::Display for AddressKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct AddressComponents {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub street: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub suburb: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub city: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub postal_code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub country: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct IdentityAccount {
pub name: String,
pub account_number: BankAccountNumber,
pub holder: String,
pub has_unlisted_holders: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
pub bank: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub branch: Option<BranchInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct BranchInfo {
#[serde(rename = "_id")]
pub id: String,
pub description: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct IdentitySource {
#[serde(rename = "_id")]
pub id: ConnectionId,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct IdentityProfile {
#[serde(rename = "_id")]
pub id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct VerifyNameRequest {
pub family_name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub given_name: Option<String>,
#[serde(
rename = "middle_name",
default,
skip_serializing_if = "Option::is_none",
with = "space_separated_strings_as_vec"
)]
pub middle_names: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct VerifyNameResponse {
pub success: bool,
pub item: VerifyNameItem,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct VerifyNameItem {
pub sources: Vec<VerificationSource>,
pub name: VerifyNameRequest,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct VerificationSource {
#[serde(rename = "type")]
pub source_type: VerificationSourceType,
pub meta: serde_json::Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub match_result: Option<MatchResult>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub verification: Option<NameVerification>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum VerificationSourceType {
HolderName,
PartyName,
}
impl VerificationSourceType {
pub const fn as_str(&self) -> &'static str {
match self {
Self::HolderName => "HOLDER_NAME",
Self::PartyName => "PARTY_NAME",
}
}
pub const fn as_bytes(&self) -> &'static [u8] {
self.as_str().as_bytes()
}
}
impl std::str::FromStr for VerificationSourceType {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"HOLDER_NAME" => Ok(Self::HolderName),
"PARTY_NAME" => Ok(Self::PartyName),
_ => Err(()),
}
}
}
impl std::convert::TryFrom<String> for VerificationSourceType {
type Error = ();
fn try_from(value: String) -> Result<Self, Self::Error> {
value.parse()
}
}
impl std::convert::TryFrom<&str> for VerificationSourceType {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
value.parse()
}
}
impl std::fmt::Display for VerificationSourceType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum MatchResult {
Match,
PartialMatch,
}
impl MatchResult {
pub const fn as_str(&self) -> &'static str {
match self {
Self::Match => "MATCH",
Self::PartialMatch => "PARTIAL_MATCH",
}
}
pub const fn as_bytes(&self) -> &'static [u8] {
self.as_str().as_bytes()
}
}
impl std::str::FromStr for MatchResult {
type Err = ();
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"MATCH" => Ok(Self::Match),
"PARTIAL_MATCH" => Ok(Self::PartialMatch),
_ => Err(()),
}
}
}
impl std::convert::TryFrom<String> for MatchResult {
type Error = ();
fn try_from(value: String) -> Result<Self, Self::Error> {
value.parse()
}
}
impl std::convert::TryFrom<&str> for MatchResult {
type Error = ();
fn try_from(value: &str) -> Result<Self, Self::Error> {
value.parse()
}
}
impl std::fmt::Display for MatchResult {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_str())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct NameVerification {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub family_name: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub given_name: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub middle_name: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub middle_initial: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub given_initial: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Party {
#[serde(rename = "_id")]
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub addresses: Option<Vec<Address>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tax_number: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub meta: Option<serde_json::Value>,
}