thisweek_core/calendar/
gregorian.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use super::Calendar;
use super::CalendarSpecificDateView;
use super::CalendarView;
use super::CALENDAR_GREGORIAN;
use crate::language::str_to_vec;
use crate::language::Language;
use crate::week_info::Date;
use crate::week_info::DateView;
use crate::weekdays::convert_weekday;
use chrono::Datelike;
use chrono::{DateTime, Local};
use serde::Serialize;

include!("../weekday_names.rs");
include!("../month_names.rs");
include!("../season_names.rs");
include!("./calendar_names.rs");

#[derive(Debug, Serialize, Clone, PartialEq)]
pub struct GregorianCalendar;

impl CalendarSpecificDateView for GregorianCalendar {
    fn new_date(datetime: DateTime<Local>) -> Date {
        Date {
            calendar: Calendar::Gregorian(GregorianCalendar),
            day: datetime.day(),
            month: datetime.month(),
            weekday: convert_weekday(datetime.weekday()) as u32,
            year: datetime.year(),
        }
    }

    fn new_date_view(datetime: DateTime<Local>, lang: &Language) -> DateView {
        let day = lang.change_numbers_language(&datetime.day().to_string());
        let month = datetime.month0() as usize;
        let month = match lang {
            Language::English => GREGORIAN_MONTH_NAME_EN[month],
            Language::Farsi => GREGORIAN_MONTH_NAME_FA[month],
            Language::Chinese => GREGORIAN_MONTH_NAME_ZH[month],
            Language::Arabic => GREGORIAN_MONTH_NAME_AR[month],
        };
        let month = month.to_string();
        let year = lang.change_numbers_language(&datetime.year().to_string());

        let weekday = datetime.weekday();
        let weekday = convert_weekday(weekday) as usize;
        let full_format = match lang {
            Language::English => format!("{}, {} {} {}", WEEKDAY_NAME_FULL_EN[weekday], day, month, year),
            Language::Farsi => format!("{}، {} {} {}", WEEKDAY_NAME_FULL_FA[weekday], day, month, year),
            Language::Chinese => format!("{}, {} {} {}", WEEKDAY_NAME_FULL_CN[weekday], day, month, year),
            Language::Arabic => format!("{}، {} {} {}", WEEKDAY_NAME_FULL_AR[weekday], day, month, year),
        }.to_string();
        let weekday = match lang {
            Language::English => WEEKDAY_NAME_FULL_EN[weekday],
            Language::Farsi => WEEKDAY_NAME_FULL_FA[weekday],
            Language::Chinese => WEEKDAY_NAME_FULL_CN[weekday],
            Language::Arabic => WEEKDAY_NAME_FULL_AR[weekday],
        }.to_string();

        DateView {
            unix_day: 0,
            day,
            month,
            weekday,
            year,
            full_format,
        }
    }

    fn get_calendar_view(lang: &Language) -> CalendarView {
        let months_names: Vec<String> = match lang {
            Language::English => str_to_vec(&GREGORIAN_MONTH_NAME_EN),
            Language::Farsi => str_to_vec(&GREGORIAN_MONTH_NAME_FA),
            Language::Chinese => str_to_vec(&GREGORIAN_MONTH_NAME_ZH),
            Language::Arabic => str_to_vec(&GREGORIAN_MONTH_NAME_AR),
        };
        let seasons_names: Vec<String> = match lang {
            Language::English => str_to_vec(&SEASON_NAME_EN),
            Language::Farsi => str_to_vec(&SEASON_NAME_FA),
            Language::Chinese => str_to_vec(&SEASON_NAME_ZH),
            Language::Arabic => str_to_vec(&SEASON_NAME_AR),
        };
        let calendar_name: String = match lang {
            Language::English => GREGORIAN_CALENDAR_NAME_EN.into(),
            Language::Farsi => GREGORIAN_CALENDAR_NAME_FA.into(),
            Language::Chinese => GREGORIAN_CALENDAR_NAME_ZH.into(),
            Language::Arabic => GREGORIAN_CALENDAR_NAME_AR.into(),
        };
        CalendarView {
            calendar: CALENDAR_GREGORIAN,
            calendar_name,
            language: lang.clone().into(),
            direction: lang.default_direction(),
            months_names,
            seasons_names,
        }
    }
}