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}