use crate::calendar::Calendar;
use crate::utilities::unpack_date;
use time::{Date, Month, Weekday};
use RustQuant_iso::iso_10383::XBOT;
use RustQuant_iso::iso_3166::BOTSWANA;
use RustQuant_iso::{ISO_10383, ISO_3166};
pub struct BotswanaCalendar;
impl Calendar for BotswanaCalendar {
fn new() -> Self {
Self
}
fn name(&self) -> &'static str {
"Botswana"
}
fn country_code(&self) -> ISO_3166 {
BOTSWANA
}
fn market_identifier_code(&self) -> ISO_10383 {
XBOT
}
fn is_holiday(&self, date: Date) -> bool {
let (_, m, d, wd, yd, em) = unpack_date(date, false);
if (
((d == 1 || (d == 2 && wd == Weekday::Monday) || (d == 3 && wd == Weekday::Tuesday)) && m == Month::January) ||
(yd == em - 3) ||
(yd == em) ||
((d == 1 || (d == 2 && wd == Weekday::Monday)) && m == Month::May) ||
(yd == em + 38) ||
((d == 1 || (d == 2 && wd == Weekday::Monday)) && m == Month::July) ||
((15..=21).contains(&d) && wd == Weekday::Monday && m == Month::July) ||
((d == 30 && m == Month::September) || (d == 1 && wd == Weekday::Monday && m == Month::October)) ||
((d == 1 || (d == 2 && wd == Weekday::Monday) || (d == 3 && wd == Weekday::Tuesday)) && m == Month::October) ||
(d == 25 && m == Month::December) ||
((d == 26 || (d == 27 && wd == Weekday::Monday)) && m == Month::December)
) {
return true;
}
false
}
}