#[cfg(target_os = "windows")]
extern crate everything_sys_bindgen;
use everything_sys_bindgen::*;
use serde::{Deserialize, Serialize};
use std::fmt::{self, Display, Formatter};
use ts_rs::TS;
#[repr(u32)]
#[derive(
thiserror::Error,
Debug,
Copy,
Clone,
PartialEq,
Eq,
Hash,
PartialOrd,
Ord,
Serialize,
Deserialize,
TS,
)]
pub enum EverythingSDKError {
Ok = EVERYTHING_OK,
Memory = EVERYTHING_ERROR_MEMORY,
Ipc = EVERYTHING_ERROR_IPC,
RegisterClassEx = EVERYTHING_ERROR_REGISTERCLASSEX,
CreateWindow = EVERYTHING_ERROR_CREATEWINDOW,
CreateThread = EVERYTHING_ERROR_CREATETHREAD,
InvalidIndex = EVERYTHING_ERROR_INVALIDINDEX,
InvalidCall = EVERYTHING_ERROR_INVALIDCALL,
InvalidRequest = EVERYTHING_ERROR_INVALIDREQUEST,
InvalidParameter = EVERYTHING_ERROR_INVALIDPARAMETER,
}
impl From<EverythingSDKError> for String {
fn from(error: EverythingSDKError) -> Self {
format!("{:?}", error)
}
}
impl TryFrom<u32> for EverythingSDKError {
type Error = &'static str;
fn try_from(error: u32) -> Result<Self, Self::Error> {
let err = match error {
EVERYTHING_OK => EverythingSDKError::Ok,
EVERYTHING_ERROR_MEMORY => EverythingSDKError::Memory,
EVERYTHING_ERROR_IPC => EverythingSDKError::Ipc,
EVERYTHING_ERROR_REGISTERCLASSEX => EverythingSDKError::RegisterClassEx,
EVERYTHING_ERROR_CREATEWINDOW => EverythingSDKError::CreateWindow,
EVERYTHING_ERROR_CREATETHREAD => EverythingSDKError::CreateThread,
EVERYTHING_ERROR_INVALIDINDEX => EverythingSDKError::InvalidIndex,
EVERYTHING_ERROR_INVALIDCALL => EverythingSDKError::InvalidCall,
EVERYTHING_ERROR_INVALIDREQUEST => EverythingSDKError::InvalidRequest,
EVERYTHING_ERROR_INVALIDPARAMETER => EverythingSDKError::InvalidParameter,
_ => Err("Unknown error code")?,
};
Ok(err)
}
}
impl Display for EverythingSDKError {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
write!(f, "{:?}", self)
}
}
#[derive(Debug, thiserror::Error)]
pub enum EverythingError {
#[error("Everything SDK error: {0}")]
SDKError(#[from] EverythingSDKError),
#[error("Timeout waiting for Everything to respond")]
DatabaseTimeout,
#[error("Null pointer returned by Everything SDK")]
NullPointerError,
}
impl EverythingError {
pub fn to_user_friendly_message(&self) -> String {
match self {
EverythingError::SDKError(EverythingSDKError::Ipc) => {
"Connection to Everything service failed. Is Everything running? \
Please make sure the Everything application is running and try again."
.to_string()
}
EverythingError::SDKError(EverythingSDKError::Memory) => {
"Out of memory error. The system might be low on resources.".to_string()
}
EverythingError::DatabaseTimeout => {
"Timeout waiting for Everything database. The database might be still loading or \
the Everything service might be busy. Please try again later."
.to_string()
}
_ => self.to_string(),
}
}
}
pub type EverythingResult<T> = Result<T, EverythingError>;