wdext 0.1.0

A DbgEng wrapper framework
// SPDX-FileCopyrightText: 2026 takubokudori
// SPDX-License-Identifier: MIT OR Apache-2.0
use crate::{DbgModelResult, dbgmodel::*, dmerr, impl_debug_interface, pcw};
use windows::Win32::System::Diagnostics::Debug::Extensions::{
    IDebugHostEvaluator, IDebugHostEvaluator2,
};
use windy::WStr;

impl_debug_interface!(
    DebugHostEvaluator,
    DebugHostEvaluatorRef,
    IDebugHostEvaluator2,
    IDebugHostEvaluator
);

impl DebugHostEvaluator {
    pub fn evaluate_expression<'a>(
        &self,
        context: impl Into<NonNullHostContextBy<'a>>,
        expression: impl AsRef<WStr>,
        binding_context: &ModelObject,
    ) -> DbgModelResult<(ModelObject, Option<KeyStore>)> {
        let mut result = None;
        let mut metadata = None;
        unsafe {
            dmerr!(
                result,
                self.0.EvaluateExpression(
                    context.into().as_raw(),
                    pcw!(expression),
                    binding_context.as_raw(),
                    &mut result,
                    Some(&mut metadata)
                )
            );
        }
        Ok((result.unwrap().into(), metadata.map(Into::into)))
    }

    pub fn evaluate_extended_expression<'a>(
        &self,
        context: impl Into<NonNullHostContextBy<'a>>,
        expression: impl AsRef<WStr>,
        binding_context: &ModelObject,
    ) -> DbgModelResult<(ModelObject, Option<KeyStore>)> {
        let mut result = None;
        let mut metadata = None;
        unsafe {
            dmerr!(
                result,
                self.0.EvaluateExtendedExpression(
                    context.into().as_raw(),
                    pcw!(expression),
                    binding_context.as_raw(),
                    &mut result,
                    Some(&mut metadata)
                )
            );
        }
        Ok((result.unwrap().into(), metadata.map(Into::into)))
    }
}