use crate::{
b2w,
dbgeng::WinResult,
dbgmodel::{ModelObject, key_store::KeyStore},
impl_debug_interface,
};
use windows::Win32::{
Foundation::E_BOUNDS,
System::Diagnostics::Debug::Extensions::IKeyEnumerator,
};
use windy::WString;
impl_debug_interface!(KeyEnumerator, KeyEnumeratorRef, IKeyEnumerator);
pub type KeyData = (WString, ModelObject, Option<KeyStore>);
impl KeyEnumerator {
pub fn reset(&self) -> WinResult<()> { unsafe { self.0.Reset() } }
pub fn get_next(&self) -> Option<WinResult<KeyData>> {
let mut value = None;
let mut metadata = None;
unsafe {
let mut key = std::mem::zeroed();
match self.0.GetNext(
&mut key,
Some(&mut value),
Some(&mut metadata),
) {
Ok(_) => Some(Ok((
b2w!(key),
value.unwrap().into(),
metadata.map(|x| x.into()),
))),
Err(e) if e.code() == E_BOUNDS => None,
Err(e) => Some(Err(e)),
}
}
}
}