use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum StretchError {
InvalidFormat(String),
InvalidRatio(String),
IoError(String),
InputTooShort { provided: usize, minimum: usize },
BpmDetectionFailed(String),
NonFiniteInput,
InvalidChannelIndex { requested: usize, available: usize },
BufferOverflow {
buffer: &'static str,
requested: usize,
available: usize,
},
InvalidState(&'static str),
}
impl fmt::Display for StretchError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
StretchError::InvalidFormat(msg) => write!(f, "invalid format: {}", msg),
StretchError::InvalidRatio(msg) => write!(f, "invalid stretch ratio: {}", msg),
StretchError::IoError(msg) => write!(f, "I/O error: {}", msg),
StretchError::InputTooShort { provided, minimum } => {
write!(
f,
"input too short: {} samples provided, {} required",
provided, minimum
)
}
StretchError::BpmDetectionFailed(msg) => {
write!(f, "BPM detection failed: {}", msg)
}
StretchError::NonFiniteInput => {
write!(f, "input contains non-finite samples (NaN or infinity)")
}
StretchError::InvalidChannelIndex {
requested,
available,
} => write!(
f,
"invalid channel index {} (available channels: {})",
requested, available
),
StretchError::BufferOverflow {
buffer,
requested,
available,
} => write!(
f,
"buffer overflow in {}: requested {}, available {}",
buffer, requested, available
),
StretchError::InvalidState(msg) => write!(f, "invalid state: {}", msg),
}
}
}
impl std::error::Error for StretchError {}
impl From<std::io::Error> for StretchError {
fn from(err: std::io::Error) -> Self {
StretchError::IoError(err.to_string())
}
}