use crate::calendar::Calendar;
use crate::utilities::unpack_date;
use time::{Date, Month, Weekday};
use RustQuant_iso::*;
pub struct ChileCalendar;
impl Calendar for ChileCalendar {
fn new() -> Self {
Self
}
fn name(&self) -> &'static str {
"Chile"
}
fn country_code(&self) -> ISO_3166 {
CHILE
}
fn market_identifier_code(&self) -> ISO_10383 {
XSGO
}
fn is_holiday(&self, date: Date) -> bool {
let (y, m, d, wd, yd, em) = unpack_date(date, false);
if (
(d == 1 && m == Month::January) || (d == 2 && m == Month::January && wd == Weekday::Monday && y > 2016)
|| (yd == em - 3)
|| (yd == em - 2)
|| (d == 1 && m == Month::May)
|| (d == 21 && m == Month::May)
|| (d == 21 && m == Month::June && y >= 2021)
|| ((26..=29).contains(&d) && m == Month::June && wd == Weekday::Monday)
|| (d == 2 && m == Month::July && wd == Weekday::Monday)
|| (d == 16 && m == Month::July)
|| (d == 15 && m == Month::August)
|| (d == 17 && m == Month::September && ((wd == Weekday::Monday && y >= 2007)
|| (wd == Weekday::Friday && y > 2016)))
|| (d == 18 && m == Month::September)
|| (d == 19 && m == Month::September)
|| (d == 20 && m == Month::September && wd == Weekday::Friday && y >= 2007)
|| ((9..=12).contains(&d) && m == Month::October && wd == Weekday::Monday)
|| (d == 15 && m == Month::October && wd == Weekday::Monday)
|| (((d == 27 && m == Month::October && wd == Weekday::Friday)
|| (d == 31 && m == Month::October && wd != Weekday::Tuesday && wd != Weekday::Wednesday)
|| (d == 2 && m == Month::November && wd == Weekday::Friday)) && y >= 2008)
|| (d == 1 && m == Month::November)
|| (d == 8 && m == Month::December)
|| (d == 25 && m == Month::December)
) {
return true;
}
false
}
}