use crate::checker::{Builtin, Checker, OriginalEntry, OriginalHolidayChecker};
use std::any::TypeId;
use std::sync::Arc;
pub(crate) struct HolidayCheckerRegistry {
checkers: Vec<Checker>,
}
impl HolidayCheckerRegistry {
pub(crate) fn new() -> Self {
let mut checkers: Vec<Checker> =
Builtin::ALL.iter().map(|b| Checker::Builtin(*b)).collect();
checkers.push(Checker::Transfer);
checkers.push(Checker::National);
HolidayCheckerRegistry { checkers }
}
pub(crate) fn checkers(&self) -> &[Checker] {
&self.checkers
}
pub(crate) fn snapshot(&self) -> Vec<Checker> {
self.checkers.clone()
}
pub(crate) fn register<C: OriginalHolidayChecker + 'static>(&mut self, checker: C) {
let type_id = TypeId::of::<C>();
if self
.checkers
.iter()
.any(|c| matches!(c, Checker::Original(e) if e.type_id == type_id))
{
return;
}
self.checkers.push(Checker::Original(OriginalEntry {
type_id,
checker: Arc::new(checker),
}));
}
pub(crate) fn unregister<C: OriginalHolidayChecker + 'static>(&mut self) {
let type_id = TypeId::of::<C>();
self.checkers
.retain(|c| !matches!(c, Checker::Original(e) if e.type_id == type_id));
}
}