use std::fmt;
#[derive(Debug)]
pub enum Error {
Io(std::io::Error),
BadMagic,
UnsupportedMajor(u16),
UnknownHashAlgo(u8),
ReservedType,
NilUid,
UsedExceedsMax,
InvalidLabel,
TableHashMismatch,
DataHashMismatch,
DataTooLarge,
NotFound,
DuplicateUid,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Io(e) => write!(f, "i/o error: {e}"),
Error::BadMagic => write!(f, "bad magic: not a PCF file"),
Error::UnsupportedMajor(v) => write!(f, "unsupported major version {v}"),
Error::UnknownHashAlgo(id) => write!(f, "unknown hash algorithm id {id}"),
Error::ReservedType => write!(f, "reserved partition type used for a live entry"),
Error::NilUid => write!(f, "NIL UID used for a live entry"),
Error::UsedExceedsMax => write!(f, "used_bytes exceeds max_length"),
Error::InvalidLabel => write!(f, "invalid label"),
Error::TableHashMismatch => write!(f, "table block hash mismatch"),
Error::DataHashMismatch => write!(f, "partition data hash mismatch"),
Error::DataTooLarge => write!(f, "data larger than partition reservation"),
Error::NotFound => write!(f, "partition not found"),
Error::DuplicateUid => write!(f, "duplicate UID"),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
_ => None,
}
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::Io(e)
}
}
pub type Result<T> = std::result::Result<T, Error>;