use std::io::Write;
use crate::bank_account::AccountResult;
use crate::company_id::CompanyResult;
use crate::credit_card::CardResult;
use crate::driver_license::DriverLicenseResult;
use crate::lei::LeiResult;
use crate::passport::PassportResult;
use crate::personal_id::IdResult;
use crate::swift::SwiftResult;
use crate::tax_id::TaxIdResult;
use crate::vat::VatResult;
fn csv_field(s: &str) -> String {
if s.contains(',') || s.contains('"') || s.contains('\n') || s.contains('\r') {
format!("\"{}\"", s.replace('"', "\"\""))
} else {
s.to_string()
}
}
pub const IBAN_HEADER: &str = "country,iban,iban_formatted,valid";
pub const ID_HEADER: &str = "country,id_name,code,gender,dob,valid";
pub const CARD_HEADER: &str = "brand,number,formatted,cvv,expiry,valid";
pub const SWIFT_HEADER: &str = "country,bank,location,branch,code,valid";
pub const COMPANY_HEADER: &str = "country,id_name,code,valid";
pub fn iban_row(iban_code: &str, formatted: &str, valid: bool) -> String {
format!(
"{},{},{},{}",
csv_field(&iban_code[..2]),
csv_field(iban_code),
csv_field(formatted),
valid
)
}
pub fn id_row(country: &str, id_name: &str, result: &IdResult) -> String {
format!(
"{},{},{},{},{},{}",
csv_field(country),
csv_field(id_name),
csv_field(&result.code),
csv_field(result.gender.as_deref().unwrap_or("")),
csv_field(result.dob.as_deref().unwrap_or("")),
result.valid
)
}
pub fn card_row(result: &CardResult) -> String {
format!(
"{},{},{},{},{},{}",
csv_field(&result.brand),
csv_field(&result.number),
csv_field(&result.formatted),
csv_field(&result.cvv),
csv_field(&result.expiry),
result.valid
)
}
pub fn swift_row(result: &SwiftResult) -> String {
format!(
"{},{},{},{},{},{}",
csv_field(&result.country),
csv_field(&result.bank),
csv_field(&result.location),
csv_field(result.branch.as_deref().unwrap_or("")),
csv_field(&result.code),
result.valid
)
}
pub fn company_row(result: &CompanyResult) -> String {
format!(
"{},{},{},{}",
csv_field(&result.country_code),
csv_field(&result.name),
csv_field(&result.code),
result.valid
)
}
pub fn write_iban_csv<W: Write>(
writer: &mut W,
rows: &[(String, String, bool)],
) -> std::io::Result<()> {
writeln!(writer, "{}", IBAN_HEADER)?;
for (iban_code, formatted, valid) in rows {
writeln!(writer, "{}", iban_row(iban_code, formatted, *valid))?;
}
Ok(())
}
pub fn write_id_csv<W: Write>(
writer: &mut W,
country: &str,
id_name: &str,
results: &[IdResult],
) -> std::io::Result<()> {
writeln!(writer, "{}", ID_HEADER)?;
for result in results {
writeln!(writer, "{}", id_row(country, id_name, result))?;
}
Ok(())
}
pub const ACCOUNT_HEADER: &str =
"country,country_name,format,bank_code,branch_code,account_number,check_digits,formatted,raw,iban,valid";
pub fn account_row(result: &AccountResult) -> String {
format!(
"{},{},{},{},{},{},{},{},{},{},{}",
csv_field(&result.country_code),
csv_field(&result.country_name),
csv_field(&result.format_name),
csv_field(result.bank_code.as_deref().unwrap_or("")),
csv_field(result.branch_code.as_deref().unwrap_or("")),
csv_field(&result.account_number),
csv_field(result.check_digits.as_deref().unwrap_or("")),
csv_field(&result.formatted),
csv_field(&result.raw),
csv_field(result.iban.as_deref().unwrap_or("")),
result.valid,
)
}
pub fn write_account_csv<W: Write>(
writer: &mut W,
results: &[AccountResult],
) -> std::io::Result<()> {
writeln!(writer, "{}", ACCOUNT_HEADER)?;
for result in results {
writeln!(writer, "{}", account_row(result))?;
}
Ok(())
}
pub const LICENSE_HEADER: &str = "country,country_name,name,code,state,valid";
pub fn license_row(result: &DriverLicenseResult) -> String {
format!(
"{},{},{},{},{},{}",
csv_field(&result.country_code),
csv_field(&result.country_name),
csv_field(&result.name),
csv_field(&result.code),
csv_field(result.state.as_deref().unwrap_or("")),
result.valid
)
}
pub const TAX_HEADER: &str = "country,country_name,name,code,holder_type,valid";
pub fn tax_row(result: &TaxIdResult) -> String {
format!(
"{},{},{},{},{},{}",
csv_field(&result.country_code),
csv_field(&result.country_name),
csv_field(&result.name),
csv_field(&result.code),
csv_field(result.holder_type.as_deref().unwrap_or("")),
result.valid
)
}
pub const LEI_HEADER: &str = "lei,lou,country,valid";
pub fn lei_row(result: &LeiResult) -> String {
format!(
"{},{},{},{}",
csv_field(&result.code),
csv_field(&result.lou),
csv_field(&result.country_code),
result.valid
)
}
pub const VAT_HEADER: &str = "vat,country_code,country_name,valid";
pub fn vat_row(result: &VatResult) -> String {
format!(
"{},{},{},{}",
csv_field(&result.code),
csv_field(&result.country_code),
csv_field(&result.country_name),
result.valid
)
}
pub const PASSPORT_HEADER: &str = "country,country_name,name,code,valid";
pub fn passport_row(result: &PassportResult) -> String {
format!(
"{},{},{},{},{}",
csv_field(&result.country_code),
csv_field(&result.country_name),
csv_field(&result.name),
csv_field(&result.code),
result.valid
)
}