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