use crate::records::{file::FileEntry, icon::IconEntry};
#[derive(Clone, Copy, Debug)]
pub struct Shortcut<'a> {
pub icon: &'a IconEntry,
pub target: Option<&'a FileEntry>,
}
#[derive(Clone)]
pub struct ShortcutIter<'a> {
icons: std::slice::Iter<'a, IconEntry>,
files: &'a [FileEntry],
}
impl<'a> ShortcutIter<'a> {
pub(crate) fn new(icons: &'a [IconEntry], files: &'a [FileEntry]) -> Self {
Self {
icons: icons.iter(),
files,
}
}
fn match_target(&self, icon_filename: &str) -> Option<&'a FileEntry> {
if icon_filename.is_empty() {
return None;
}
self.files.iter().find(|f| f.destination == icon_filename)
}
}
impl<'a> Iterator for ShortcutIter<'a> {
type Item = Shortcut<'a>;
fn next(&mut self) -> Option<Self::Item> {
let icon = self.icons.next()?;
let target = self.match_target(&icon.filename);
Some(Shortcut { icon, target })
}
}