use core::fmt;
pub type Result<T> = core::result::Result<T, Error>;
#[non_exhaustive]
#[derive(Debug)]
pub enum Error {
NotDms,
HeaderCrc,
NotTrack,
TrackHeaderCrc,
TrackDataCrc {
track: u16,
},
Checksum {
track: u16,
},
BadData {
track: u16,
},
UnknownMode(u8),
PasswordRequired,
Fms,
Truncated,
TooLarge,
#[cfg(feature = "std")]
Io(std::io::Error),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::NotDms => f.write_str("not a DMS archive"),
Self::HeaderCrc => f.write_str("archive header CRC mismatch"),
Self::NotTrack => f.write_str("not a track header"),
Self::TrackHeaderCrc => f.write_str("track header CRC mismatch"),
Self::TrackDataCrc { track } => write!(f, "packed-data CRC mismatch on track {track}"),
Self::Checksum { track } => write!(f, "checksum mismatch on track {track}"),
Self::BadData { track } => write!(f, "invalid compressed data on track {track}"),
Self::UnknownMode(mode) => write!(f, "unknown compression mode {mode}"),
Self::PasswordRequired => f.write_str("archive is encrypted; a password is required"),
Self::Fms => f.write_str("FMS archive, not a DMS disk image"),
Self::Truncated => f.write_str("truncated header or track"),
Self::TooLarge => f.write_str("track larger than the maximum supported size"),
#[cfg(feature = "std")]
Self::Io(err) => write!(f, "I/O error: {err}"),
}
}
}
impl core::error::Error for Error {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
match self {
#[cfg(feature = "std")]
Self::Io(err) => Some(err),
_ => None,
}
}
}
#[cfg(feature = "std")]
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Self::Io(err)
}
}
#[cfg(test)]
mod tests {
use super::Error;
#[test]
fn display_is_nonempty_and_names_track() {
assert!(!Error::NotDms.to_string().is_empty());
assert!(Error::Checksum { track: 7 }.to_string().contains('7'));
}
#[cfg(feature = "std")]
#[test]
fn converts_from_io_error() {
let io = std::io::Error::new(std::io::ErrorKind::UnexpectedEof, "eof");
assert!(matches!(Error::from(io), Error::Io(_)));
}
}