mod holy_day_providing;
pub use holy_day_providing::*;
use std::collections::BTreeMap;
use rust_i18n::t;
use crate::{HOLY_DAYS_FALLBACK, YEAR_SPECIFICS};
#[derive(Debug, Copy, Clone, Eq, Hash, Ord, PartialEq, PartialOrd)]
pub enum BahaiHolyDay {
NawRuz,
Ridvan1st,
Ridvan9th,
Ridvan12th,
DeclarationOfTheBab,
AscensionOfBahaullah,
MartyrdomOfTheBab,
BirthOfTheBab,
BirthOfBahaullah,
DayOfTheCovenant,
AscensionOfAbdulBaha,
}
impl BahaiHolyDay {
pub fn english(&self) -> String {
self.name("en")
}
pub fn name(&self, locale: &str) -> String {
match self {
BahaiHolyDay::NawRuz => t!("naw_ruz", locale = locale),
BahaiHolyDay::Ridvan1st => t!("ridvan_1st", locale = locale),
BahaiHolyDay::Ridvan9th => t!("ridvan_9th", locale = locale),
BahaiHolyDay::Ridvan12th => t!("ridvan_12th", locale = locale),
BahaiHolyDay::DeclarationOfTheBab => t!("declaration_of_the_bab", locale = locale),
BahaiHolyDay::AscensionOfBahaullah => t!("ascension_of_bahaullah", locale = locale),
BahaiHolyDay::MartyrdomOfTheBab => t!("martyrdom_of_the_bab", locale = locale),
BahaiHolyDay::BirthOfTheBab => t!("birth_of_the_bab", locale = locale),
BahaiHolyDay::BirthOfBahaullah => t!("birth_of_bahaullah", locale = locale),
BahaiHolyDay::DayOfTheCovenant => t!("day_of_the_covenant", locale = locale),
BahaiHolyDay::AscensionOfAbdulBaha => t!("ascension_of_abdul_baha", locale = locale),
}
.to_string()
}
pub fn day_of_year(&self, year: u8) -> u16 {
let day = *HOLY_DAYS_FALLBACK.get(self).unwrap();
if [BahaiHolyDay::BirthOfTheBab, BahaiHolyDay::BirthOfBahaullah].contains(self) {
return match YEAR_SPECIFICS.get(&year) {
Some(specifics) => {
if self == &BahaiHolyDay::BirthOfTheBab {
specifics.birth_of_bab
} else {
specifics.birth_of_bab + 1
}
}
None => day,
};
}
day
}
pub fn work_suspended(&self) -> bool {
![
BahaiHolyDay::DayOfTheCovenant,
BahaiHolyDay::AscensionOfAbdulBaha,
]
.contains(self)
}
pub(crate) fn holy_days_for_year(year: u8) -> BTreeMap<u16, BahaiHolyDay> {
let specifics: Option<&crate::YearSpecifics> = YEAR_SPECIFICS.get(&year);
HOLY_DAYS_FALLBACK
.iter()
.map(|(k, v)| {
let key = match specifics {
Some(specifics) => match k {
BahaiHolyDay::BirthOfTheBab => specifics.birth_of_bab,
BahaiHolyDay::BirthOfBahaullah => specifics.birth_of_bab + 1,
_ => *v,
},
None => *v,
};
(key, *k)
})
.collect()
}
}