///|
fn DateRule::matches_ordinal_weekday(
self : DateRule,
value : DateTime,
period_year : Int32,
) -> Bool {
guard self.bynweekday is Some(weekdays) else { return true }
let (first, last) = if self.frequency is Yearly && self.bymonth is None {
(days_from_civil(period_year, 1, 1), days_from_civil(period_year + 1, 1, 1))
} else {
let first = days_from_civil(value.year, value.month, 1)
(first, first + days_in_month(value.year, value.month))
}
let day = Int64::from_int(days_from_civil(value.year, value.month, value.day))
for weekday in weekdays {
let nth = Int64::from_int(weekday.nth.unwrap_or(1))
let target = Int64::from_int(weekday.weekday)
let selected = if nth > 0L {
let start = Int64::from_int(first)
let current = ((start + 3L) % 7L + 7L) % 7L
start + (target - current + 7L) % 7L + (nth - 1L) * 7L
} else {
let stop = Int64::from_int(last - 1)
let current = ((stop + 3L) % 7L + 7L) % 7L
stop - (current - target + 7L) % 7L - (-nth - 1L) * 7L
}
if selected == day &&
selected >= Int64::from_int(first) &&
selected < Int64::from_int(last) {
return true
}
}
false
}