win_idispatch/
errors.rs

1use thiserror::Error;
2use winapi::shared::winerror::{
3    CLASS_E_NOAGGREGATION, DISP_E_UNKNOWNLCID, DISP_E_UNKNOWNNAME, E_NOINTERFACE, E_OUTOFMEMORY,
4    E_POINTER, HRESULT, REGDB_E_CLASSNOTREG,
5};
6
7use win_variant::{VariantArgError, VariantResultError};
8
9#[derive(Debug, Error)]
10pub enum HResultError {
11    #[error("class is not registered")]
12    ClassNotRegister,
13    #[error("class not part of aggregate")]
14    ClassNotPartOfAggregate,
15    #[error("unkown name when performing lookup on dispatch interface")]
16    UnknownDispatchName,
17    #[error("unkown local id")]
18    UnknownLocalID,
19    #[error("class does not implement an interface")]
20    NoInterface,
21    #[error("not enough memory to perform operation")]
22    NotEnoughMemory,
23    #[error("null pointer provided when expecting an initialized one")]
24    NullPointer,
25    #[error("unknown HRESULT `{0}`")]
26    Unknown(HRESULT),
27}
28
29#[derive(Debug, Error)]
30pub enum Error {
31    #[error("hresult error: {0}")]
32    HResult(HResultError),
33    #[error("unknown interface pointer is null")]
34    NullUnknownPointer,
35    #[error("dispath interface pointer is null")]
36    NullDispatchPointer,
37    #[error("failed to convert string to wide char string: {0}")]
38    ToWideCharStringError(widestring::NulError<u16>),
39    #[error("variant arg error: {0}")]
40    VariantArgError(VariantArgError),
41    #[error("failed convert variant into result: {0}")]
42    VariantResultError(VariantResultError),
43}
44
45impl From<HRESULT> for Error {
46    fn from(e: HRESULT) -> Self {
47        let hr = match e {
48            REGDB_E_CLASSNOTREG => HResultError::ClassNotRegister,
49            CLASS_E_NOAGGREGATION => HResultError::ClassNotPartOfAggregate,
50            DISP_E_UNKNOWNNAME => HResultError::UnknownDispatchName,
51            DISP_E_UNKNOWNLCID => HResultError::UnknownLocalID,
52            E_NOINTERFACE => HResultError::NoInterface,
53            E_OUTOFMEMORY => HResultError::NotEnoughMemory,
54            E_POINTER => HResultError::NullPointer,
55            _ => HResultError::Unknown(e),
56        };
57        Error::HResult(hr)
58    }
59}
60
61impl From<widestring::NulError<u16>> for Error {
62    fn from(e: widestring::NulError<u16>) -> Self {
63        Error::ToWideCharStringError(e)
64    }
65}
66
67impl From<VariantResultError> for Error {
68    fn from(e: VariantResultError) -> Self {
69        Error::VariantResultError(e)
70    }
71}
72
73impl From<VariantArgError> for Error {
74    fn from(e: VariantArgError) -> Self {
75        Error::VariantArgError(e)
76    }
77}