use crate::c;
use c::GgError::*;
use core::fmt;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
#[repr(u32)]
pub enum Error {
Failure = GG_ERR_FAILURE as u32,
Retry = GG_ERR_RETRY as u32,
Busy = GG_ERR_BUSY as u32,
Fatal = GG_ERR_FATAL as u32,
Invalid = GG_ERR_INVALID as u32,
Unsupported = GG_ERR_UNSUPPORTED as u32,
Parse = GG_ERR_PARSE as u32,
Range = GG_ERR_RANGE as u32,
Nomem = GG_ERR_NOMEM as u32,
Noconn = GG_ERR_NOCONN as u32,
Nodata = GG_ERR_NODATA as u32,
Noentry = GG_ERR_NOENTRY as u32,
Config = GG_ERR_CONFIG as u32,
Remote = GG_ERR_REMOTE as u32,
Expected = GG_ERR_EXPECTED as u32,
Timeout = GG_ERR_TIMEOUT as u32,
Unauthorized = GG_ERR_UNAUTHORIZED as u32,
Conflict = GG_ERR_CONFLICT as u32,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = unsafe {
let ptr = c::gg_strerror((*self).into());
let cstr = core::ffi::CStr::from_ptr(ptr.cast());
core::str::from_utf8_unchecked(cstr.to_bytes())
};
write!(f, "{s}")
}
}
pub type Result<T> = core::result::Result<T, Error>;
impl From<Error> for c::GgError {
fn from(val: Error) -> Self {
match val {
Error::Failure => GG_ERR_FAILURE,
Error::Retry => GG_ERR_RETRY,
Error::Busy => GG_ERR_BUSY,
Error::Fatal => GG_ERR_FATAL,
Error::Invalid => GG_ERR_INVALID,
Error::Unsupported => GG_ERR_UNSUPPORTED,
Error::Parse => GG_ERR_PARSE,
Error::Range => GG_ERR_RANGE,
Error::Nomem => GG_ERR_NOMEM,
Error::Noconn => GG_ERR_NOCONN,
Error::Nodata => GG_ERR_NODATA,
Error::Noentry => GG_ERR_NOENTRY,
Error::Config => GG_ERR_CONFIG,
Error::Remote => GG_ERR_REMOTE,
Error::Expected => GG_ERR_EXPECTED,
Error::Timeout => GG_ERR_TIMEOUT,
Error::Unauthorized => GG_ERR_UNAUTHORIZED,
Error::Conflict => GG_ERR_CONFLICT,
}
}
}
impl From<Result<()>> for c::GgError {
fn from(value: Result<()>) -> Self {
match value {
Ok(()) => c::GgError::GG_ERR_OK,
Err(e) => e.into(),
}
}
}
impl From<c::GgError> for Result<()> {
fn from(err: c::GgError) -> Self {
match err {
GG_ERR_OK => Ok(()),
GG_ERR_FAILURE => Err(Error::Failure),
GG_ERR_RETRY => Err(Error::Retry),
GG_ERR_BUSY => Err(Error::Busy),
GG_ERR_FATAL => Err(Error::Fatal),
GG_ERR_INVALID => Err(Error::Invalid),
GG_ERR_UNSUPPORTED => Err(Error::Unsupported),
GG_ERR_PARSE => Err(Error::Parse),
GG_ERR_RANGE => Err(Error::Range),
GG_ERR_NOMEM => Err(Error::Nomem),
GG_ERR_NOCONN => Err(Error::Noconn),
GG_ERR_NODATA => Err(Error::Nodata),
GG_ERR_NOENTRY => Err(Error::Noentry),
GG_ERR_CONFIG => Err(Error::Config),
GG_ERR_REMOTE => Err(Error::Remote),
GG_ERR_EXPECTED => Err(Error::Expected),
GG_ERR_TIMEOUT => Err(Error::Timeout),
GG_ERR_UNAUTHORIZED => Err(Error::Unauthorized),
GG_ERR_CONFLICT => Err(Error::Conflict),
}
}
}