use core::fmt;
#[derive(Debug)]
pub enum CpioError {
Io(hadris_io::Error),
InvalidMagic { found: [u8; 6] },
InvalidHexField { field: &'static str },
InvalidFilename,
MissingTrailer,
ChecksumMismatch { expected: u32, computed: u32 },
#[cfg(feature = "write")]
UnresolvedHardLink { ino: u32 },
#[cfg(feature = "write")]
FilenameTooLong,
#[cfg(feature = "write")]
FileTooLarge,
}
impl fmt::Display for CpioError {
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::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 CpioError {}
impl From<hadris_io::Error> for CpioError {
fn from(e: hadris_io::Error) -> Self {
Self::Io(e)
}
}
pub type Result<T> = core::result::Result<T, CpioError>;