use std::collections::HashMap;
use pogo_masterfile_types::{
MasterfileEntry,
gender_settings::{GenderSettingsEntry, GenderSettingsTemplateId},
};
pub struct GenderSettingsAccessor<'a> {
pub(crate) entries: &'a [MasterfileEntry],
pub(crate) index: &'a HashMap<GenderSettingsTemplateId, usize>,
pub(crate) order: &'a [usize],
}
impl<'a> GenderSettingsAccessor<'a> {
pub fn get<I>(&self, id: I) -> Option<&'a GenderSettingsEntry>
where
I: TryInto<GenderSettingsTemplateId>,
{
let typed = id.try_into().ok()?;
let idx = *self.index.get(&typed)?;
match &self.entries[idx] {
MasterfileEntry::GenderSettings(e) => Some(e),
_ => None,
}
}
pub fn has<I>(&self, id: I) -> bool
where
I: TryInto<GenderSettingsTemplateId>,
{
self.get(id).is_some()
}
pub fn iter(&self) -> impl Iterator<Item = &'a GenderSettingsEntry> + '_ {
self.order
.iter()
.filter_map(|&idx| match &self.entries[idx] {
MasterfileEntry::GenderSettings(e) => Some(e),
_ => None,
})
}
pub fn template_ids(&self) -> impl Iterator<Item = GenderSettingsTemplateId> + '_ {
self.index.keys().copied()
}
pub fn len(&self) -> usize {
self.order.len()
}
pub fn is_empty(&self) -> bool {
self.order.is_empty()
}
}