use crate::records::registry::{RegistryEntry, RegistryFlag};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RegistryOpKind {
Write,
WriteIfMissing,
DeleteValue,
DeleteKey,
}
#[derive(Clone, Copy, Debug)]
pub struct RegistryOp<'a> {
pub kind: RegistryOpKind,
pub source: &'a RegistryEntry,
}
impl RegistryOp<'_> {
fn classify(entry: &RegistryEntry) -> RegistryOpKind {
if entry.flags.contains(&RegistryFlag::DeleteKey) {
RegistryOpKind::DeleteKey
} else if entry.flags.contains(&RegistryFlag::DeleteValue) {
RegistryOpKind::DeleteValue
} else if entry
.flags
.contains(&RegistryFlag::CreateValueIfDoesntExist)
{
RegistryOpKind::WriteIfMissing
} else {
RegistryOpKind::Write
}
}
}
#[derive(Clone)]
pub struct RegistryOpIter<'a> {
inner: std::slice::Iter<'a, RegistryEntry>,
}
impl<'a> RegistryOpIter<'a> {
pub(crate) fn new(entries: &'a [RegistryEntry]) -> Self {
Self {
inner: entries.iter(),
}
}
}
impl<'a> Iterator for RegistryOpIter<'a> {
type Item = RegistryOp<'a>;
fn next(&mut self) -> Option<Self::Item> {
let source = self.inner.next()?;
Some(RegistryOp {
kind: RegistryOp::classify(source),
source,
})
}
}