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}