thisweek_core/calendar/
gregorian.rs1use 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}