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