use core::fmt;
#[derive(Debug)]
pub enum Error {
Io(hadris_io::Error),
InvalidMagic {
found: [u8; 6],
},
InvalidHexField {
field: &'static str,
},
InvalidFilename,
InvalidHeader {
reason: &'static str,
},
MissingTrailer,
ChecksumMismatch {
expected: u32,
computed: u32,
},
#[cfg(feature = "write")]
UnresolvedHardLink {
ino: u32,
},
#[cfg(feature = "write")]
FilenameTooLong,
#[cfg(feature = "write")]
FileTooLarge,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Io(e) => write!(f, "I/O error: {e:?}"),
Self::InvalidMagic { found } => {
write!(
f,
"invalid CPIO magic: expected 070701 or 070702, found {:?}",
core::str::from_utf8(found).unwrap_or("<invalid>")
)
}
Self::InvalidHexField { field } => {
write!(f, "invalid hex field: {field}")
}
Self::InvalidFilename => write!(f, "invalid filename"),
Self::InvalidHeader { reason } => write!(f, "invalid CPIO header: {reason}"),
Self::MissingTrailer => write!(f, "missing TRAILER!!! sentinel"),
Self::ChecksumMismatch { expected, computed } => {
write!(
f,
"checksum mismatch: expected {expected:#010x}, computed {computed:#010x}"
)
}
#[cfg(feature = "write")]
Self::UnresolvedHardLink { ino } => {
write!(f, "unresolved hard link: inode {ino}")
}
#[cfg(feature = "write")]
Self::FilenameTooLong => write!(f, "filename too long"),
#[cfg(feature = "write")]
Self::FileTooLarge => write!(f, "file too large"),
}
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
impl<E: hadris_io::IoError> From<hadris_io::Error<E>> for Error {
fn from(e: hadris_io::Error<E>) -> Self {
Self::Io(e.erase())
}
}
pub type Result<T> = core::result::Result<T, Error>;