1use serde::{Deserialize, Serialize};
6
7use crate::{BankAccountNumber, ConnectionId, space_separated_strings_as_vec};
8
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
11#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
12pub enum IdentityStatus {
13 Processing,
15 Complete,
17 Error,
19}
20
21impl IdentityStatus {
22 pub const fn as_str(&self) -> &'static str {
24 match self {
25 Self::Processing => "PROCESSING",
26 Self::Complete => "COMPLETE",
27 Self::Error => "ERROR",
28 }
29 }
30
31 pub const fn as_bytes(&self) -> &'static [u8] {
33 self.as_str().as_bytes()
34 }
35}
36
37impl std::str::FromStr for IdentityStatus {
38 type Err = ();
39 fn from_str(s: &str) -> Result<Self, Self::Err> {
40 match s {
41 "PROCESSING" => Ok(Self::Processing),
42 "COMPLETE" => Ok(Self::Complete),
43 "ERROR" => Ok(Self::Error),
44 _ => Err(()),
45 }
46 }
47}
48
49impl std::convert::TryFrom<String> for IdentityStatus {
50 type Error = ();
51 fn try_from(value: String) -> Result<Self, ()> {
52 value.parse()
53 }
54}
55
56impl std::convert::TryFrom<&str> for IdentityStatus {
57 type Error = ();
58 fn try_from(value: &str) -> Result<Self, ()> {
59 value.parse()
60 }
61}
62
63impl std::fmt::Display for IdentityStatus {
64 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
65 write!(f, "{}", self.as_str())
66 }
67}
68
69#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
71pub struct Identity {
72 pub name: String,
74
75 pub formatted_account: BankAccountNumber,
77
78 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub meta: Option<serde_json::Value>,
81}
82
83#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
85pub struct Address {
86 #[serde(rename = "type")]
88 pub kind: AddressKind,
89
90 pub value: String,
92
93 #[serde(default, skip_serializing_if = "Option::is_none")]
95 pub formatted_address: Option<String>,
96
97 #[serde(default, skip_serializing_if = "Option::is_none")]
99 pub place_id: Option<String>,
100
101 #[serde(default, skip_serializing_if = "Option::is_none")]
103 pub components: Option<AddressComponents>,
104}
105
106#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
108#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
109pub enum AddressKind {
110 Residential,
112 Postal,
114 Unknown,
116}
117
118impl AddressKind {
119 pub const fn as_str(&self) -> &'static str {
121 match self {
122 Self::Residential => "RESIDENTIAL",
123 Self::Postal => "POSTAL",
124 Self::Unknown => "UNKNOWN",
125 }
126 }
127
128 pub const fn as_bytes(&self) -> &'static [u8] {
130 self.as_str().as_bytes()
131 }
132}
133
134impl std::str::FromStr for AddressKind {
135 type Err = ();
136 fn from_str(s: &str) -> Result<Self, Self::Err> {
137 match s {
138 "RESIDENTIAL" => Ok(Self::Residential),
139 "POSTAL" => Ok(Self::Postal),
140 "UNKNOWN" => Ok(Self::Unknown),
141 _ => Err(()),
142 }
143 }
144}
145
146impl std::convert::TryFrom<String> for AddressKind {
147 type Error = ();
148 fn try_from(value: String) -> Result<Self, Self::Error> {
149 value.parse()
150 }
151}
152
153impl std::convert::TryFrom<&str> for AddressKind {
154 type Error = ();
155 fn try_from(value: &str) -> Result<Self, Self::Error> {
156 value.parse()
157 }
158}
159
160impl std::fmt::Display for AddressKind {
161 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
162 write!(f, "{}", self.as_str())
163 }
164}
165
166#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
168pub struct AddressComponents {
169 #[serde(default, skip_serializing_if = "Option::is_none")]
171 pub street: Option<String>,
172
173 #[serde(default, skip_serializing_if = "Option::is_none")]
175 pub suburb: Option<String>,
176
177 #[serde(default, skip_serializing_if = "Option::is_none")]
179 pub city: Option<String>,
180
181 #[serde(default, skip_serializing_if = "Option::is_none")]
183 pub region: Option<String>,
184
185 #[serde(default, skip_serializing_if = "Option::is_none")]
187 pub postal_code: Option<String>,
188
189 #[serde(default, skip_serializing_if = "Option::is_none")]
191 pub country: Option<String>,
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
196pub struct IdentityAccount {
197 pub name: String,
199
200 pub account_number: BankAccountNumber,
202
203 pub holder: String,
205
206 pub has_unlisted_holders: bool,
208
209 #[serde(default, skip_serializing_if = "Option::is_none")]
211 pub address: Option<String>,
212
213 pub bank: String,
215
216 #[serde(default, skip_serializing_if = "Option::is_none")]
218 pub branch: Option<BranchInfo>,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
223pub struct BranchInfo {
224 #[serde(rename = "_id")]
226 pub id: String,
227
228 pub description: String,
230
231 #[serde(default, skip_serializing_if = "Option::is_none")]
233 pub phone: Option<String>,
234
235 #[serde(default, skip_serializing_if = "Option::is_none")]
237 pub address: Option<String>,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
242pub struct IdentitySource {
243 #[serde(rename = "_id")]
245 pub id: ConnectionId,
246}
247
248#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
250pub struct IdentityProfile {
251 #[serde(rename = "_id")]
253 pub id: String,
254}
255
256#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
258pub struct VerifyNameRequest {
259 pub family_name: String,
261
262 #[serde(default, skip_serializing_if = "Option::is_none")]
264 pub given_name: Option<String>,
265
266 #[serde(
269 rename = "middle_name",
270 default,
271 skip_serializing_if = "Option::is_none",
272 with = "space_separated_strings_as_vec"
273 )]
274 pub middle_names: Option<Vec<String>>,
275}
276
277#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
279pub struct VerifyNameResponse {
280 pub success: bool,
282
283 pub item: VerifyNameItem,
285}
286
287#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
289pub struct VerifyNameItem {
290 pub sources: Vec<VerificationSource>,
292
293 pub name: VerifyNameRequest,
295}
296
297#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
299pub struct VerificationSource {
300 #[serde(rename = "type")]
302 pub source_type: VerificationSourceType,
303
304 pub meta: serde_json::Value,
306
307 #[serde(default, skip_serializing_if = "Option::is_none")]
309 pub match_result: Option<MatchResult>,
310
311 #[serde(default, skip_serializing_if = "Option::is_none")]
313 pub verification: Option<NameVerification>,
314}
315
316#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
318#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
319pub enum VerificationSourceType {
320 HolderName,
322 PartyName,
324}
325
326impl VerificationSourceType {
327 pub const fn as_str(&self) -> &'static str {
329 match self {
330 Self::HolderName => "HOLDER_NAME",
331 Self::PartyName => "PARTY_NAME",
332 }
333 }
334
335 pub const fn as_bytes(&self) -> &'static [u8] {
337 self.as_str().as_bytes()
338 }
339}
340
341impl std::str::FromStr for VerificationSourceType {
342 type Err = ();
343 fn from_str(s: &str) -> Result<Self, Self::Err> {
344 match s {
345 "HOLDER_NAME" => Ok(Self::HolderName),
346 "PARTY_NAME" => Ok(Self::PartyName),
347 _ => Err(()),
348 }
349 }
350}
351
352impl std::convert::TryFrom<String> for VerificationSourceType {
353 type Error = ();
354 fn try_from(value: String) -> Result<Self, Self::Error> {
355 value.parse()
356 }
357}
358
359impl std::convert::TryFrom<&str> for VerificationSourceType {
360 type Error = ();
361 fn try_from(value: &str) -> Result<Self, Self::Error> {
362 value.parse()
363 }
364}
365
366impl std::fmt::Display for VerificationSourceType {
367 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
368 write!(f, "{}", self.as_str())
369 }
370}
371
372#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
374#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
375pub enum MatchResult {
376 Match,
378 PartialMatch,
380}
381
382impl MatchResult {
383 pub const fn as_str(&self) -> &'static str {
385 match self {
386 Self::Match => "MATCH",
387 Self::PartialMatch => "PARTIAL_MATCH",
388 }
389 }
390
391 pub const fn as_bytes(&self) -> &'static [u8] {
393 self.as_str().as_bytes()
394 }
395}
396
397impl std::str::FromStr for MatchResult {
398 type Err = ();
399 fn from_str(s: &str) -> Result<Self, Self::Err> {
400 match s {
401 "MATCH" => Ok(Self::Match),
402 "PARTIAL_MATCH" => Ok(Self::PartialMatch),
403 _ => Err(()),
404 }
405 }
406}
407
408impl std::convert::TryFrom<String> for MatchResult {
409 type Error = ();
410 fn try_from(value: String) -> Result<Self, Self::Error> {
411 value.parse()
412 }
413}
414
415impl std::convert::TryFrom<&str> for MatchResult {
416 type Error = ();
417 fn try_from(value: &str) -> Result<Self, Self::Error> {
418 value.parse()
419 }
420}
421
422impl std::fmt::Display for MatchResult {
423 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
424 write!(f, "{}", self.as_str())
425 }
426}
427
428#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
430pub struct NameVerification {
431 #[serde(default, skip_serializing_if = "Option::is_none")]
433 pub family_name: Option<bool>,
434
435 #[serde(default, skip_serializing_if = "Option::is_none")]
437 pub given_name: Option<bool>,
438
439 #[serde(default, skip_serializing_if = "Option::is_none")]
441 pub middle_name: Option<bool>,
442
443 #[serde(default, skip_serializing_if = "Option::is_none")]
445 pub middle_initial: Option<bool>,
446
447 #[serde(default, skip_serializing_if = "Option::is_none")]
449 pub given_initial: Option<bool>,
450}
451
452#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
457pub struct Party {
458 #[serde(rename = "_id")]
460 pub id: String,
461
462 pub name: String,
464
465 #[serde(default, skip_serializing_if = "Option::is_none")]
467 pub email: Option<String>,
468
469 #[serde(default, skip_serializing_if = "Option::is_none")]
471 pub phone: Option<String>,
472
473 #[serde(default, skip_serializing_if = "Option::is_none")]
475 pub addresses: Option<Vec<Address>>,
476
477 #[serde(default, skip_serializing_if = "Option::is_none")]
479 pub tax_number: Option<String>,
480
481 #[serde(default, skip_serializing_if = "Option::is_none")]
483 pub meta: Option<serde_json::Value>,
484}