zemen/
validator.rs

1use crate::error::Error;
2
3pub fn is_leap_year(year: i32) -> bool {
4    year % 4 == 3
5}
6
7pub fn is_valid_date(year: i32, month: u8, day: u8) -> Result<(), Error> {
8    if is_leap_year(year) {
9        if month == 13 && day > 6 {
10            return Err(Error::InvalidRange {
11                name: "day",
12                given: day as i32,
13                min: 1,
14                max: 6,
15            });
16        }
17    } else if month == 13 && day > 5 {
18        return Err(Error::InvalidRange {
19            name: "day",
20            given: day as i32,
21            min: 1,
22            max: 5,
23        });
24    }
25
26    if month > 13 {
27        return Err(Error::InvalidRange {
28            name: "month",
29            given: month as i32,
30            min: 1,
31            max: 30,
32        });
33    }
34
35    if day > 30 {
36        return Err(Error::InvalidRange {
37            name: "day",
38            given: day as i32,
39            min: 1,
40            max: 30,
41        });
42    }
43
44    Ok(())
45}
46
47pub fn days_in_year(year: i32) -> u16 {
48    if is_leap_year(year) {
49        366
50    } else {
51        365
52    }
53}
54
55#[cfg(not(feature = "time"))]
56pub mod gre {
57
58    pub fn is_leap_year(year: u64) -> bool {
59        (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)
60    }
61
62    pub fn days_in_year(year: u64) -> u16 {
63        if is_leap_year(year) {
64            366
65        } else {
66            365
67        }
68    }
69}
70
71#[cfg(test)]
72mod tests {
73    use super::{days_in_year, is_leap_year, is_valid_date};
74
75    #[test]
76    fn validator_leap_year() {
77        for year_offset in (0..=40).step_by(4) {
78            assert!(is_leap_year(2000 + year_offset + 3));
79        }
80    }
81
82    #[test]
83    fn validator_days_in_year() {
84        assert_eq!(days_in_year(2003), 366);
85        assert_ne!(days_in_year(2000), 366);
86
87        assert_eq!(days_in_year(2001), 365);
88        assert_ne!(days_in_year(2001), 366);
89    }
90
91    #[test]
92    fn validator_valid_date() {
93        let (year, month, day) = (2000, 13, 5);
94        is_valid_date(year, month, day).unwrap();
95
96        let (year, month, day) = (2001, 13, 5);
97        is_valid_date(year, month, day).unwrap();
98
99        let (year, month, day) = (2003, 13, 6);
100        is_valid_date(year, month, day).unwrap();
101
102        let (year, month, day) = (2000, 13, 7);
103        is_valid_date(year, month, day).unwrap_err();
104
105        let (year, month, day) = (2001, 13, 6);
106        is_valid_date(year, month, day).unwrap_err();
107    }
108}