use crate::easter;
use crate::HolidayCalendar;
use ::chrono::{Datelike, Weekday};
pub struct BRSettlement;
fn is_brazilian_national_holiday<T: Datelike + Copy + PartialOrd>(date: T) -> bool {
let (yy, mm, dd) = (date.year(), date.month(), date.day());
if mm >= 8 {
if
((mm == 9) && (dd == 7))
||
((mm == 10) && (dd == 12))
||
((mm == 11) && (dd == 2))
||
((mm == 11) && (dd == 15))
||
((mm == 11) && (dd == 20) && (yy > 2023))
||
((mm == 12) && (dd == 25))
{
return true;
}
} else {
if
((mm == 1) && (dd == 1))
||
((mm == 4) && (dd == 21))
||
((mm == 5) && (dd == 1))
{
return true;
}
let dt_rata = date.num_days_from_ce();
let e_rata = easter::easter_num_days_from_ce(yy).unwrap();
if
( dt_rata == ( e_rata - 48 ) )
||
( dt_rata == ( e_rata - 47 ) )
||
( dt_rata == ( e_rata - 2 ) )
||
( dt_rata == ( e_rata + 60 ) )
{
return true;
}
}
false
}
impl<T: Datelike + Copy + PartialOrd> HolidayCalendar<T> for BRSettlement {
fn is_holiday(&self, date: T) -> bool {
is_brazilian_national_holiday(date)
}
}
pub struct BrazilExchange;
impl<T: Datelike + Copy + PartialOrd> HolidayCalendar<T> for BrazilExchange {
fn is_holiday(&self, date: T) -> bool {
let (yy, mm, dd) = (date.year(), date.month(), date.day());
if
( mm == 1 && dd == 25 && yy < 2022 )
||
( mm == 7 && dd == 9 && yy != 2020 && yy < 2022 )
||
( yy >= 2007 && mm == 11 && dd == 20 && yy != 2020 && yy < 2022 )
||
( mm == 12 && dd == 24)
||
( mm == 12 && (dd == 31 || (dd>=29 && date.weekday() == Weekday::Fri) ))
{
return true;
}
is_brazilian_national_holiday(date)
}
}