use std::{
error::Error,
fmt::{self, Display},
};
macro_rules! from_err {
($($err:path => $variant:ident),*) => {
$(
impl From<$err> for BlkidErr {
fn from(v: $err) -> Self {
BlkidErr::$variant(v)
}
}
)*
}
}
from_err!(
std::ffi::NulError => Null,
std::ffi::FromBytesWithNulError => BytesWithNull,
std::io::Error => IO,
std::str::Utf8Error => UTF8,
std::string::FromUtf8Error => FromUTF8
);
pub type Result<T> = std::result::Result<T, BlkidErr>;
#[derive(Debug)]
pub enum BlkidErr {
Null(std::ffi::NulError),
BytesWithNull(std::ffi::FromBytesWithNulError),
IntoString(std::ffi::IntoStringError),
PositiveReturnCode,
InvalidConv,
UTF8(std::str::Utf8Error),
FromUTF8(std::string::FromUtf8Error),
IO(std::io::Error),
Uuid(uuid::Error),
Other(String),
LibErr(i64),
}
impl Display for BlkidErr {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
BlkidErr::Null(ref e) => write!(f, "Null error during string conversion: {e}"),
BlkidErr::BytesWithNull(ref e) => write!(f, "Null error when converting from slice: {e}"),
BlkidErr::IntoString(ref e) => write!(f, "Could not convert C string to string: {e}"),
BlkidErr::PositiveReturnCode => {
write!(f, "Positive return code found when <= 0 was expected")
}
BlkidErr::InvalidConv => write!(f, "The requested conversion was unsuccessful"),
BlkidErr::UTF8(ref e) => write!(f, "UTF8 error: {e}"),
BlkidErr::FromUTF8(ref e) => write!(f, "UTF8 conversion error: {e}"),
BlkidErr::IO(ref e) => write!(f, "An IO error occurred: {e}"),
BlkidErr::Uuid(ref e) => write!(f, "A UUID error occurred: {e}"),
BlkidErr::Other(ref s) => write!(f, "{s}"),
BlkidErr::LibErr(code) => write!(f, "libblkid returned an error code indicating an operation could not be completed successfully: {code}"),
}
}
}
impl Error for BlkidErr {}