use super::swift_utils::parse_swift_chars;
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 Field75 {
pub information: Vec<String>,
}
impl SwiftField for Field75 {
fn parse(input: &str) -> crate::Result<Self>
where
Self: Sized,
{
let mut information = Vec::new();
for line in input.lines() {
if information.len() >= 6 {
break;
}
if line.len() > 35 {
return Err(ParseError::InvalidFormat {
message: format!(
"Field75 line cannot exceed 35 characters, found {}",
line.len()
),
});
}
parse_swift_chars(line, "Field75 line")?;
information.push(line.to_string());
}
if information.is_empty() {
return Err(ParseError::InvalidFormat {
message: "Field75 requires at least one line of information".to_string(),
});
}
Ok(Field75 { information })
}
fn to_swift_string(&self) -> String {
let content = self.information.join("\n");
format!(":75:{}", content)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_field75_parse() {
let field =
Field75::parse("QUERY: TRANSACTION STATUS\nREF: MT103 20240719001\nPLEASE CONFIRM")
.unwrap();
assert_eq!(field.information.len(), 3);
assert_eq!(field.information[0], "QUERY: TRANSACTION STATUS");
assert_eq!(field.information[1], "REF: MT103 20240719001");
assert_eq!(field.information[2], "PLEASE CONFIRM");
let field = Field75::parse("STATUS REQUEST").unwrap();
assert_eq!(field.information.len(), 1);
assert_eq!(field.information[0], "STATUS REQUEST");
}
#[test]
fn test_field75_to_swift_string() {
let field = Field75 {
information: vec![
"QUERY: TRANSACTION STATUS".to_string(),
"REF: MT103 20240719001".to_string(),
"PLEASE CONFIRM".to_string(),
],
};
assert_eq!(
field.to_swift_string(),
":75:QUERY: TRANSACTION STATUS\nREF: MT103 20240719001\nPLEASE CONFIRM"
);
}
#[test]
fn test_field75_parse_invalid() {
assert!(Field75::parse("").is_err());
assert!(
Field75::parse(
"THIS LINE IS DEFINITELY TOO LONG AND EXCEEDS THE THIRTY FIVE CHARACTER LIMIT"
)
.is_err()
);
}
}