1#[cfg(target_os = "windows")]
2extern crate everything_sys_bindgen;
3
4use everything_sys_bindgen::*;
5use serde::{Deserialize, Serialize};
6use std::fmt::{self, Display, Formatter};
7use ts_rs::TS;
8
9#[repr(u32)]
13#[derive(
14 thiserror::Error,
15 Debug,
16 Copy,
17 Clone,
18 PartialEq,
19 Eq,
20 Hash,
21 PartialOrd,
22 Ord,
23 Serialize,
24 Deserialize,
25 TS,
26)]
27pub enum EverythingSDKError {
28 Ok = EVERYTHING_OK,
30 Memory = EVERYTHING_ERROR_MEMORY,
32 Ipc = EVERYTHING_ERROR_IPC,
34 RegisterClassEx = EVERYTHING_ERROR_REGISTERCLASSEX,
36 CreateWindow = EVERYTHING_ERROR_CREATEWINDOW,
38 CreateThread = EVERYTHING_ERROR_CREATETHREAD,
40 InvalidIndex = EVERYTHING_ERROR_INVALIDINDEX,
42 InvalidCall = EVERYTHING_ERROR_INVALIDCALL,
44 InvalidRequest = EVERYTHING_ERROR_INVALIDREQUEST,
47 InvalidParameter = EVERYTHING_ERROR_INVALIDPARAMETER,
49}
50
51impl From<EverythingSDKError> for String {
52 fn from(error: EverythingSDKError) -> Self {
53 format!("{:?}", error)
54 }
55}
56
57impl TryFrom<u32> for EverythingSDKError {
58 type Error = &'static str;
59
60 fn try_from(error: u32) -> Result<Self, Self::Error> {
61 let err = match error {
62 EVERYTHING_OK => EverythingSDKError::Ok,
63 EVERYTHING_ERROR_MEMORY => EverythingSDKError::Memory,
64 EVERYTHING_ERROR_IPC => EverythingSDKError::Ipc,
65 EVERYTHING_ERROR_REGISTERCLASSEX => EverythingSDKError::RegisterClassEx,
66 EVERYTHING_ERROR_CREATEWINDOW => EverythingSDKError::CreateWindow,
67 EVERYTHING_ERROR_CREATETHREAD => EverythingSDKError::CreateThread,
68 EVERYTHING_ERROR_INVALIDINDEX => EverythingSDKError::InvalidIndex,
69 EVERYTHING_ERROR_INVALIDCALL => EverythingSDKError::InvalidCall,
70 EVERYTHING_ERROR_INVALIDREQUEST => EverythingSDKError::InvalidRequest,
71 EVERYTHING_ERROR_INVALIDPARAMETER => EverythingSDKError::InvalidParameter,
72 _ => Err("Unknown error code")?,
73 };
74 Ok(err)
75 }
76}
77
78impl Display for EverythingSDKError {
79 fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
80 write!(f, "{:?}", self)
81 }
82}
83
84#[derive(Debug, thiserror::Error)]
85pub enum EverythingError {
86 #[error("Everything SDK error: {0}")]
87 SDKError(#[from] EverythingSDKError),
88 #[error("Timeout waiting for Everything to respond")]
89 DatabaseTimeout,
90 #[error("Null pointer returned by Everything SDK")]
91 NullPointerError,
92}
93
94impl EverythingError {
95 pub fn to_user_friendly_message(&self) -> String {
97 match self {
98 EverythingError::SDKError(EverythingSDKError::Ipc) => {
99 "Connection to Everything service failed. Is Everything running? \
100 Please make sure the Everything application is running and try again."
101 .to_string()
102 }
103 EverythingError::SDKError(EverythingSDKError::Memory) => {
104 "Out of memory error. The system might be low on resources.".to_string()
105 }
106 EverythingError::DatabaseTimeout => {
107 "Timeout waiting for Everything database. The database might be still loading or \
108 the Everything service might be busy. Please try again later."
109 .to_string()
110 }
111 _ => self.to_string(),
112 }
113 }
114}
115
116pub type EverythingResult<T> = Result<T, EverythingError>;