1use time::{format_description, Date, Error, UtcOffset, Weekday};
2
3include!(concat!(env!("OUT_DIR"), "/holiday_data.rs"));
4
5pub fn is_offday(date: &str) -> Result<(bool, Option<&'static str>), Error> {
18 let format = format_description::parse("[year]-[month]-[day]")?;
19 let date = Date::parse(date, &format)?;
20 let year = date.year();
21 let weekday = date.weekday();
22
23 if let Some(year_data) = get_year_data(year) {
24 if let Some((name, is_off_day)) = year_data.get(&date.format(&format).unwrap()) {
25 return Ok((*is_off_day, Some(name)));
26 }
27 }
28
29 Ok((matches!(weekday, Weekday::Saturday | Weekday::Sunday), None))
31}
32
33pub fn is_workday(date: &str) -> Result<bool, Error> {
44 let (is_off, _) = is_offday(date)?;
45 Ok(!is_off)
46}
47
48pub fn is_now_offday() -> (bool, Option<&'static str>) {
56 let now = time::OffsetDateTime::now_utc().to_offset(UtcOffset::from_hms(8, 0, 0).unwrap());
57 let date = now.date();
58 let format = format_description::parse("[year]-[month]-[day]").unwrap();
59 is_offday(&date.format(&format).unwrap()).unwrap()
60}
61
62pub fn is_now_workday() -> bool {
68 let (is_off, _) = is_now_offday();
69 !is_off
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75
76 #[test]
77 fn test_is_offday() {
78 let result = is_offday("2025-01-01").unwrap();
80 assert!(result.0); assert_eq!(result.1.unwrap(), "元旦"); let result = is_offday("2025-01-02").unwrap(); assert!(!result.0); assert_eq!(result.1, None);
87
88 let result = is_offday("2025-01-04").unwrap(); assert!(result.0); assert_eq!(result.1, None);
92
93 let result = is_offday("2025-09-28").unwrap(); assert!(!result.0); assert_eq!(result.1.unwrap(), "国庆节、中秋节");
97 }
98
99 #[test]
100 fn test_is_workday() {
101 assert!(!is_workday("2025-01-01").unwrap()); assert!(is_workday("2025-01-02").unwrap()); assert!(!is_workday("2025-01-04").unwrap()); assert!(is_workday("2025-09-28").unwrap()); }
113
114 #[test]
115 fn test_invalid_date() {
116 assert!(is_offday("invalid-date").is_err());
117 assert!(is_workday("invalid-date").is_err());
118 }
119}