use chdlady_core::ChdError;
use std::fmt;
use std::io;
#[derive(Debug)]
pub enum DiscError {
Io(io::Error),
Chd(ChdError),
Hound(hound::Error),
InvalidCue(String),
InvalidGdi(String),
InvalidToc(String),
InvalidCcd(String),
InvalidMds(String),
InvalidNrg(String),
InvalidMetadata(String),
UnsupportedTrackType(String),
MissingSubcodeForCloneCd,
SectorSizeMismatch {
expected: usize,
found: usize,
},
}
impl fmt::Display for DiscError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Io(e) => write!(f, "I/O error: {}", e),
Self::Chd(e) => write!(f, "CHD error: {}", e),
Self::Hound(e) => write!(f, "WAV error: {}", e),
Self::InvalidCue(msg) => write!(f, "invalid CUE: {}", msg),
Self::InvalidGdi(msg) => write!(f, "invalid GDI: {}", msg),
Self::InvalidToc(msg) => write!(f, "invalid TOC: {}", msg),
Self::InvalidCcd(msg) => write!(f, "invalid CCD: {}", msg),
Self::InvalidMds(msg) => write!(f, "invalid MDS: {}", msg),
Self::InvalidNrg(msg) => write!(f, "invalid NRG: {}", msg),
Self::InvalidMetadata(msg) => write!(f, "invalid disc metadata: {}", msg),
Self::UnsupportedTrackType(t) => write!(f, "unsupported track type: {}", t),
Self::MissingSubcodeForCloneCd => write!(
f,
"cannot extract to CloneCD (.ccd/.img/.sub): the CHD container does not contain raw subchannel data (SUBTYPE: NONE); consider extracting to CUE/BIN format (.cue) instead"
),
Self::SectorSizeMismatch { expected, found } => {
write!(
f,
"sector size mismatch: expected {} bytes, found {} bytes",
expected, found
)
}
}
}
}
impl std::error::Error for DiscError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Self::Io(e) => Some(e),
Self::Chd(e) => Some(e),
Self::Hound(e) => Some(e),
_ => None,
}
}
}
impl From<io::Error> for DiscError {
fn from(err: io::Error) -> Self {
Self::Io(err)
}
}
impl From<ChdError> for DiscError {
fn from(err: ChdError) -> Self {
Self::Chd(err)
}
}
impl From<hound::Error> for DiscError {
fn from(err: hound::Error) -> Self {
Self::Hound(err)
}
}