wdext 0.1.0

A DbgEng wrapper framework
// SPDX-FileCopyrightText: 2026 takubokudori
// SPDX-License-Identifier: MIT OR Apache-2.0
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)),
            }
        }
    }
}