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 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}