use super::field_utils::parse_party_identifier;
use super::swift_utils::parse_bic;
use crate::errors::ParseError;
use crate::traits::SwiftField;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[cfg_attr(feature = "jsonschema", derive(schemars::JsonSchema))]
pub struct Field51A {
pub party_identifier: Option<String>,
pub bic: String,
}
impl SwiftField for Field51A {
fn parse(input: &str) -> crate::Result<Self>
where
Self: Sized,
{
let mut remaining = input;
let mut party_identifier = None;
if let Some(newline_pos) = input.find('\n') {
let first_line = &input[..newline_pos];
if let Some(id) = parse_party_identifier(first_line)? {
party_identifier = Some(format!("/{}", id));
remaining = &input[newline_pos + 1..];
}
}
if party_identifier.is_none() && input.starts_with('/') {
if input.len() <= 36 && !input.contains('\n') {
return Err(ParseError::InvalidFormat {
message: "Field 51A requires BIC code after party identifier".to_string(),
});
}
}
let bic = parse_bic(remaining)?;
Ok(Field51A {
party_identifier,
bic,
})
}
fn to_swift_string(&self) -> String {
let mut result = String::new();
if let Some(ref party_id) = self.party_identifier {
result.push_str(party_id);
result.push('\n');
}
result.push_str(&self.bic);
format!(":51A:{}", result)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_field51a_valid() {
let field = Field51A::parse("DEUTDEFFXXX").unwrap();
assert_eq!(field.bic, "DEUTDEFFXXX");
assert_eq!(field.party_identifier, None);
assert_eq!(field.to_swift_string(), ":51A:DEUTDEFFXXX");
let field = Field51A::parse("/D/12345678\nCHASUS33XXX").unwrap();
assert_eq!(field.bic, "CHASUS33XXX");
assert_eq!(field.party_identifier, Some("/D/12345678".to_string()));
assert_eq!(field.to_swift_string(), ":51A:/D/12345678\nCHASUS33XXX");
let field = Field51A::parse("MIDLGB22").unwrap();
assert_eq!(field.bic, "MIDLGB22");
assert_eq!(field.party_identifier, None);
}
#[test]
fn test_field51a_invalid() {
assert!(Field51A::parse("INVALID").is_err());
assert!(Field51A::parse("/D/12345678").is_err());
assert!(Field51A::parse("DEUT@EFF").is_err());
}
}