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