use crate::ffi;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ZlobError {
NoSpace,
Aborted,
ReadFailed,
PermissionDenied,
NameTooLong,
InvalidInput,
}
impl fmt::Display for ZlobError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
ZlobError::NoSpace => write!(f, "out of memory"),
ZlobError::Aborted => write!(f, "operation aborted"),
ZlobError::ReadFailed => write!(f, "directory read failed"),
ZlobError::PermissionDenied => write!(f, "permission denied"),
ZlobError::NameTooLong => write!(f, "path component too long"),
ZlobError::InvalidInput => {
write!(f, "argument contains an interior NUL byte")
}
}
}
}
impl std::error::Error for ZlobError {}
impl ZlobError {
pub(crate) fn from_code(code: i32) -> Result<bool, Self> {
match code {
0 => Ok(true),
ffi::ZLOB_NOMATCH => Ok(false),
ffi::ZLOB_NOSPACE => Err(ZlobError::NoSpace),
ffi::ZLOB_ABORTED => Err(ZlobError::Aborted),
ffi::ZLOB_READ_FAILED => Err(ZlobError::ReadFailed),
ffi::ZLOB_PERMISSION_DENIED => Err(ZlobError::PermissionDenied),
ffi::ZLOB_NAME_TOO_LONG => Err(ZlobError::NameTooLong),
_ => Err(ZlobError::Aborted),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn from_code_maps_every_native_code() {
assert_eq!(ZlobError::from_code(0), Ok(true));
assert_eq!(ZlobError::from_code(ffi::ZLOB_NOMATCH), Ok(false));
assert_eq!(
ZlobError::from_code(ffi::ZLOB_NOSPACE),
Err(ZlobError::NoSpace)
);
assert_eq!(
ZlobError::from_code(ffi::ZLOB_ABORTED),
Err(ZlobError::Aborted)
);
assert_eq!(
ZlobError::from_code(ffi::ZLOB_READ_FAILED),
Err(ZlobError::ReadFailed)
);
assert_eq!(
ZlobError::from_code(ffi::ZLOB_PERMISSION_DENIED),
Err(ZlobError::PermissionDenied)
);
assert_eq!(
ZlobError::from_code(ffi::ZLOB_NAME_TOO_LONG),
Err(ZlobError::NameTooLong)
);
assert_eq!(ZlobError::from_code(9999), Err(ZlobError::Aborted));
}
}