thisweek_core/calendar/
gregorian.rs

1use super::Calendar;
2use super::CalendarSpecificDateView;
3use super::CalendarView;
4use super::CALENDAR_GREGORIAN;
5use crate::language::str_to_vec;
6use crate::language::Language;
7use crate::week_info::Date;
8use crate::week_info::DateView;
9use crate::weekdays::convert_weekday;
10use crate::weekdays::is_weekday_weekend_holiday;
11use chrono::Datelike;
12use chrono::{DateTime, Local};
13use serde::Serialize;
14
15use crate::calendar::calendar_names::*;
16use crate::month_names::*;
17use crate::season_names::*;
18use crate::weekday_names::*;
19
20#[derive(Debug, Serialize, Clone, PartialEq)]
21pub struct GregorianCalendar;
22
23impl CalendarSpecificDateView for GregorianCalendar {
24    fn new_date(datetime: DateTime<Local>) -> Date {
25        Date {
26            calendar: Calendar::Gregorian(GregorianCalendar),
27            day: datetime.day(),
28            month: datetime.month(),
29            weekday: convert_weekday(datetime.weekday()) as u32,
30            year: datetime.year(),
31        }
32    }
33
34    fn new_date_view(datetime: DateTime<Local>, lang: &Language) -> DateView {
35        let day = lang.change_numbers_language(&datetime.day().to_string());
36        let month = datetime.month0() as usize;
37        let month = match lang {
38            Language::English => GREGORIAN_MONTH_NAME_EN[month],
39            Language::Farsi => GREGORIAN_MONTH_NAME_FA[month],
40            Language::Chinese => GREGORIAN_MONTH_NAME_ZH[month],
41            Language::Arabic => GREGORIAN_MONTH_NAME_AR[month],
42        };
43        let month = month.to_string();
44        let year = lang.change_numbers_language(&datetime.year().to_string());
45
46        let weekday = datetime.weekday();
47        let weekday = convert_weekday(weekday) as usize;
48        let weekend_holiday = is_weekday_weekend_holiday(weekday.into());
49        let full_format = match lang {
50            Language::English => format!(
51                "{}, {} {} {}",
52                WEEKDAY_NAME_FULL_EN[weekday], day, month, year
53            ),
54            Language::Farsi => format!(
55                "{}، {} {} {}",
56                WEEKDAY_NAME_FULL_FA[weekday], day, month, year
57            ),
58            Language::Chinese => format!(
59                "{}, {} {} {}",
60                WEEKDAY_NAME_FULL_CN[weekday], day, month, year
61            ),
62            Language::Arabic => format!(
63                "{}، {} {} {}",
64                WEEKDAY_NAME_FULL_AR[weekday], day, month, year
65            ),
66        }
67        .to_string();
68        let weekday = match lang {
69            Language::English => WEEKDAY_NAME_FULL_EN[weekday],
70            Language::Farsi => WEEKDAY_NAME_FULL_FA[weekday],
71            Language::Chinese => WEEKDAY_NAME_FULL_CN[weekday],
72            Language::Arabic => WEEKDAY_NAME_FULL_AR[weekday],
73        }
74        .to_string();
75
76        DateView {
77            unix_day: 0,
78            day,
79            month,
80            weekday,
81            year,
82            full_format,
83            weekend_holiday,
84        }
85    }
86
87    fn get_calendar_view(lang: &Language) -> CalendarView {
88        let months_names: Vec<String> = match lang {
89            Language::English => str_to_vec(&GREGORIAN_MONTH_NAME_EN),
90            Language::Farsi => str_to_vec(&GREGORIAN_MONTH_NAME_FA),
91            Language::Chinese => str_to_vec(&GREGORIAN_MONTH_NAME_ZH),
92            Language::Arabic => str_to_vec(&GREGORIAN_MONTH_NAME_AR),
93        };
94        let seasons_names: Vec<String> = match lang {
95            Language::English => str_to_vec(&SEASON_NAME_EN),
96            Language::Farsi => str_to_vec(&SEASON_NAME_FA),
97            Language::Chinese => str_to_vec(&SEASON_NAME_ZH),
98            Language::Arabic => str_to_vec(&SEASON_NAME_AR),
99        };
100        let calendar_name: String = match lang {
101            Language::English => GREGORIAN_CALENDAR_NAME_EN.into(),
102            Language::Farsi => GREGORIAN_CALENDAR_NAME_FA.into(),
103            Language::Chinese => GREGORIAN_CALENDAR_NAME_ZH.into(),
104            Language::Arabic => GREGORIAN_CALENDAR_NAME_AR.into(),
105        };
106        CalendarView {
107            calendar: CALENDAR_GREGORIAN,
108            calendar_name,
109            language: lang.clone().into(),
110            direction: lang.default_direction(),
111            months_names,
112            seasons_names,
113        }
114    }
115}