use std::{fmt, io, string::FromUtf8Error};
#[derive(Debug)]
#[non_exhaustive]
pub enum NappguiError {
IoError(io::Error),
Utf8Error(FromUtf8Error),
NullError(std::ffi::NulError),
Internal(NappguiErrorKind),
EnvVarError(std::env::VarError),
ParseIntError(std::num::ParseIntError),
Unknown(String),
}
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[non_exhaustive]
pub enum NappguiErrorKind {
FExists,
FNoPath,
FNoFile,
FBigName,
FNoFiles,
FNoEmpty,
FNoAccess,
FLock,
FBig,
FSeekNeg,
FUnDef,
DbindMemberExists,
DbindTypeExists,
DbindTypeUsed,
DbindAliasSize,
UndefinedError,
UndefinedEnumTransmute,
}
impl NappguiError {
pub(crate) fn from_ferror_t(err: i32) -> NappguiError {
let err_kind = match err {
nappgui_sys::_ferror_t_ekFEXISTS => NappguiErrorKind::FExists,
nappgui_sys::_ferror_t_ekFNOPATH => NappguiErrorKind::FNoPath,
nappgui_sys::_ferror_t_ekFNOFILE => NappguiErrorKind::FNoFile,
nappgui_sys::_ferror_t_ekFBIGNAME => NappguiErrorKind::FBigName,
nappgui_sys::_ferror_t_ekFNOFILES => NappguiErrorKind::FNoFiles,
nappgui_sys::_ferror_t_ekFNOEMPTY => NappguiErrorKind::FNoEmpty,
nappgui_sys::_ferror_t_ekFNOACCESS => NappguiErrorKind::FNoAccess,
nappgui_sys::_ferror_t_ekFLOCK => NappguiErrorKind::FLock,
nappgui_sys::_ferror_t_ekFUNDEF => NappguiErrorKind::FUnDef,
nappgui_sys::_ferror_t_ekFBIG => NappguiErrorKind::FBig,
nappgui_sys::_ferror_t_ekFSEEKNEG => NappguiErrorKind::FSeekNeg,
_ => NappguiErrorKind::UndefinedError,
};
NappguiError::Internal(err_kind)
}
pub(crate) fn from_dbindst_t(err: i32) -> Self {
let err_kind = match err {
nappgui_sys::_dbindst_t_ekDBIND_MEMBER_EXISTS => NappguiErrorKind::DbindMemberExists,
nappgui_sys::_dbindst_t_ekDBIND_TYPE_EXISTS => NappguiErrorKind::DbindTypeExists,
nappgui_sys::_dbindst_t_ekDBIND_TYPE_USED => NappguiErrorKind::DbindTypeUsed,
nappgui_sys::_dbindst_t_ekDBIND_ALIAS_SIZE => NappguiErrorKind::DbindAliasSize,
_ => NappguiErrorKind::UndefinedError,
};
NappguiError::Internal(err_kind)
}
}
impl std::error::Error for NappguiError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
NappguiError::IoError(err) => Some(err),
NappguiError::NullError(err) => Some(err),
_ => None,
}
}
}
impl fmt::Display for NappguiError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
NappguiError::IoError(ref err) => err.fmt(f),
NappguiError::NullError(ref err) => err.fmt(f),
NappguiError::Internal(ref err) => {
write!(f, "An internal error occurred {:?}", err)
}
NappguiError::EnvVarError(ref err) => {
write!(f, "An env var error occurred {:?}", err)
}
NappguiError::Utf8Error(ref err) => {
write!(f, "A UTF8 conversion error occurred {:?}", err)
}
NappguiError::ParseIntError(ref err) => {
write!(f, "An int parsing error occurred {:?}", err)
}
NappguiError::Unknown(ref err) => write!(f, "An unknown error occurred {:?}", err),
}
}
}
impl From<io::Error> for NappguiError {
fn from(err: io::Error) -> NappguiError {
NappguiError::IoError(err)
}
}
impl From<std::ffi::NulError> for NappguiError {
fn from(err: std::ffi::NulError) -> NappguiError {
NappguiError::NullError(err)
}
}
impl From<std::env::VarError> for NappguiError {
fn from(err: std::env::VarError) -> NappguiError {
NappguiError::EnvVarError(err)
}
}
impl From<std::string::FromUtf8Error> for NappguiError {
fn from(err: std::string::FromUtf8Error) -> NappguiError {
NappguiError::Utf8Error(err)
}
}
impl From<std::num::ParseIntError> for NappguiError {
fn from(err: std::num::ParseIntError) -> NappguiError {
NappguiError::ParseIntError(err)
}
}