wdext 0.1.0

A DbgEng wrapper framework
// SPDX-FileCopyrightText: 2026 takubokudori
// SPDX-License-Identifier: MIT OR Apache-2.0
use crate::{
    WdResult,
    dbgmodel::{DebugHostModule, DebugHostType, HostContextBy, *},
    impl_debug_interface, pcw,
};
use windows::Win32::System::Diagnostics::Debug::Extensions::{
    IDebugHostSymbols, Location,
};
use windy::WStr;

impl_debug_interface!(DebugHostSymbols, DebugHostSymbolsRef, IDebugHostSymbols);

// IDebugHostSymbols
impl DebugHostSymbols {
    pub fn create_module_signature(
        &self,
        module_name: impl AsRef<WStr>,
        min_version: impl AsRef<WStr>,
        max_version: impl AsRef<WStr>,
    ) -> WdResult<DebugHostModuleSignature> {
        unsafe {
            Ok(self
                .0
                .CreateModuleSignature(
                    pcw!(module_name),
                    pcw!(min_version),
                    pcw!(max_version),
                )?
                .into())
        }
    }

    pub fn create_type_signature(
        &self,
        signature_specification: impl AsRef<WStr>,
        module: &DebugHostModule,
    ) -> WdResult<DebugHostTypeSignature> {
        unsafe {
            Ok(self
                .0
                .CreateTypeSignature(
                    pcw!(signature_specification),
                    module.as_raw(),
                )?
                .into())
        }
    }

    pub fn create_type_signature_for_module_range(
        &self,
        signature_specification: impl AsRef<WStr>,
        module_name: impl AsRef<WStr>,
        min_version: impl AsRef<WStr>,
        max_version: impl AsRef<WStr>,
    ) -> WdResult<DebugHostTypeSignature> {
        unsafe {
            Ok(self
                .0
                .CreateTypeSignatureForModuleRange(
                    pcw!(signature_specification),
                    pcw!(module_name),
                    pcw!(min_version),
                    pcw!(max_version),
                )?
                .into())
        }
    }

    pub fn enumerate_modules<'a>(
        &self,
        context: impl Into<NonNullHostContextBy<'a>>,
    ) -> WdResult<DebugHostSymbolEnumerator> {
        unsafe { Ok(self.0.EnumerateModules(context.into().as_raw())?.into()) }
    }

    pub fn find_module_by_name<'a>(
        &self,
        context: impl Into<NonNullHostContextBy<'a>>,
        module_name: impl AsRef<WStr>,
    ) -> WdResult<DebugHostModule> {
        unsafe {
            Ok(self
                .0
                .FindModuleByName(context.into().as_raw(), pcw!(module_name))?
                .into())
        }
    }

    pub fn find_module_by_location<'a>(
        &self,
        context: impl Into<NonNullHostContextBy<'a>>,
        location: Location,
    ) -> WdResult<DebugHostModule> {
        unsafe {
            Ok(self
                .0
                .FindModuleByLocation(context.into().as_raw(), location)?
                .into())
        }
    }

    pub fn get_most_derived_object<'a>(
        &self,
        context: impl Into<HostContextBy<'a>>,
        location: Location,
        object_type: &DebugHostType,
    ) -> WdResult<(Location, DebugHostType)> {
        let mut derived_location = Location::default();
        let mut derived_type = None;
        unsafe {
            self.0.GetMostDerivedObject(
                context.into().as_raw(),
                location,
                object_type.as_raw(),
                &mut derived_location,
                &mut derived_type,
            )?;
        }
        Ok((derived_location, derived_type.unwrap().into()))
    }
}

// IDebugHostSymbols2
impl DebugHostSymbols {
    // DemangleSymbolName
}