swift_mt_message/fields/
field30.rs1use super::swift_utils::parse_date_yymmdd;
2use crate::traits::SwiftField;
3use chrono::{Datelike, NaiveDate};
4use serde::{Deserialize, Serialize};
5
6#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
18pub struct Field30 {
19    pub execution_date: NaiveDate,
21}
22
23impl SwiftField for Field30 {
24    fn parse(input: &str) -> crate::Result<Self>
25    where
26        Self: Sized,
27    {
28        let execution_date = parse_date_yymmdd(input)?;
29
30        Ok(Field30 { execution_date })
31    }
32
33    fn to_swift_string(&self) -> String {
34        format!(
35            ":30:{:02}{:02}{:02}",
36            self.execution_date.year() % 100,
37            self.execution_date.month(),
38            self.execution_date.day()
39        )
40    }
41}
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46    use chrono::Datelike;
47
48    #[test]
49    fn test_field30_parse() {
50        let field = Field30::parse("240719").unwrap();
51        assert_eq!(field.execution_date.year(), 2024);
52        assert_eq!(field.execution_date.month(), 7);
53        assert_eq!(field.execution_date.day(), 19);
54
55        let field = Field30::parse("991231").unwrap();
57        assert_eq!(field.execution_date.year(), 1999);
58
59        let field = Field30::parse("250101").unwrap();
61        assert_eq!(field.execution_date.year(), 2025);
62    }
63
64    #[test]
65    fn test_field30_to_swift_string() {
66        let field = Field30 {
67            execution_date: NaiveDate::from_ymd_opt(2024, 7, 19).unwrap(),
68        };
69        assert_eq!(field.to_swift_string(), ":30:240719");
70
71        let field = Field30 {
72            execution_date: NaiveDate::from_ymd_opt(1999, 12, 31).unwrap(),
73        };
74        assert_eq!(field.to_swift_string(), ":30:991231");
75    }
76
77    #[test]
78    fn test_field30_parse_invalid() {
79        assert!(Field30::parse("12345").is_err());
81        assert!(Field30::parse("1234567").is_err());
82
83        assert!(Field30::parse("240230").is_err()); assert!(Field30::parse("241301").is_err()); assert!(Field30::parse("24071a").is_err());
89    }
90}