#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Error {
Io { token: &'static str, offset: u64 },
BadVbr(VbrReason),
BadUpcaseTable,
BadEntrySet { token: &'static str },
Inconsistent { token: &'static str },
UnsupportedFeature(&'static str),
NotFound { component: &'static str },
NotARegularFile,
FileTooLarge { size: u64, max: u64 },
OutOfMemory { site: &'static str },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum VbrReason {
BadMagic,
BadBootSignature,
BadGeometry,
BadBootChecksum,
}
impl Error {
pub fn token(&self) -> &'static str {
match self {
Error::Io { token, .. } => token,
Error::BadVbr(r) => r.token(),
Error::BadUpcaseTable => "upcase_bad",
Error::BadEntrySet { token } => token,
Error::Inconsistent { token } => token,
Error::UnsupportedFeature(t) => t,
Error::NotFound { .. } => "not_found",
Error::NotARegularFile => "not_a_regular_file",
Error::FileTooLarge { .. } => "file_too_large",
Error::OutOfMemory { site } => site,
}
}
}
impl VbrReason {
pub(crate) fn token(self) -> &'static str {
match self {
VbrReason::BadMagic => "vbr_bad_magic",
VbrReason::BadBootSignature => "vbr_bad_boot_sig",
VbrReason::BadGeometry => "vbr_bad_geometry",
VbrReason::BadBootChecksum => "vbr_bad_checksum",
}
}
}
impl core::fmt::Display for Error {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
write!(f, "lamexfat: {}", self.token())
}
}
#[cfg(feature = "std")]
extern crate std;
#[cfg(feature = "std")]
impl std::error::Error for Error {}
pub(crate) type Result<T> = core::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn tokens_are_stable() {
assert_eq!(
Error::Io {
token: "io_vbr",
offset: 0
}
.token(),
"io_vbr"
);
assert_eq!(Error::BadVbr(VbrReason::BadMagic).token(), "vbr_bad_magic");
assert_eq!(
Error::BadVbr(VbrReason::BadBootSignature).token(),
"vbr_bad_boot_sig"
);
assert_eq!(
Error::BadVbr(VbrReason::BadGeometry).token(),
"vbr_bad_geometry"
);
assert_eq!(
Error::BadVbr(VbrReason::BadBootChecksum).token(),
"vbr_bad_checksum"
);
assert_eq!(Error::BadUpcaseTable.token(), "upcase_bad");
assert_eq!(
Error::Inconsistent { token: "fat_cycle" }.token(),
"fat_cycle"
);
assert_eq!(Error::NotFound { component: "x" }.token(), "not_found");
assert_eq!(Error::NotARegularFile.token(), "not_a_regular_file");
assert_eq!(
Error::FileTooLarge { size: 1, max: 2 }.token(),
"file_too_large"
);
}
}