everything_rs/
error.rs

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/// Represents errors that can occur when using the Everything SDK and that will be returned by Everything.get_last_error().   
10/// See <https://www.voidtools.com/support/everything/sdk/everything_getlasterror/>   
11/// Note that there is no documentation for EVERYTHING_ERROR_INVALIDREQUEST or EVERYTHING_ERROR_INVALIDPARAMETER   
12#[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    /// no error detected
29    Ok = EVERYTHING_OK,
30    /// out of memory.
31    Memory = EVERYTHING_ERROR_MEMORY,
32    /// Everything search client is not running
33    Ipc = EVERYTHING_ERROR_IPC,
34    /// unable to register window class.
35    RegisterClassEx = EVERYTHING_ERROR_REGISTERCLASSEX,
36    /// unable to create listening window
37    CreateWindow = EVERYTHING_ERROR_CREATEWINDOW,
38    /// unable to create listening thread
39    CreateThread = EVERYTHING_ERROR_CREATETHREAD,
40    /// invalid index
41    InvalidIndex = EVERYTHING_ERROR_INVALIDINDEX,
42    /// invalid call
43    InvalidCall = EVERYTHING_ERROR_INVALIDCALL,
44    /// Occurs when attempting to read a result attribute without setting the request flags for it.  
45    /// You must set request flags before trying to read a result.  
46    InvalidRequest = EVERYTHING_ERROR_INVALIDREQUEST,
47    /// bad parameter.
48    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    /// Returns a user-friendly error message with hints on how to resolve the issue
96    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>;