use thiserror::Error;
#[must_use]
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum NadaError {
#[error("buffer format mismatch: expected {expected}, got {actual}")]
FormatMismatch {
expected: String,
actual: String,
},
#[error("buffer length mismatch: expected {expected} samples, got {actual}")]
LengthMismatch {
expected: usize,
actual: usize,
},
#[error("invalid sample rate: {0} Hz")]
InvalidSampleRate(u32),
#[error("invalid channel count: {0}")]
InvalidChannels(u32),
#[error("DSP error: {0}")]
Dsp(String),
#[error("capture error: {0}")]
Capture(String),
#[error("invalid parameter: {name} = {value} ({reason})")]
InvalidParameter {
name: String,
value: String,
reason: String,
},
#[error("conversion error: {0}")]
Conversion(String),
#[error("{0}")]
Other(Box<dyn std::error::Error + Send + Sync>),
}
impl From<Box<dyn std::error::Error + Send + Sync>> for NadaError {
fn from(err: Box<dyn std::error::Error + Send + Sync>) -> Self {
Self::Other(err)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn error_display() {
let errors = [
NadaError::FormatMismatch {
expected: "44100Hz".into(),
actual: "48000Hz".into(),
},
NadaError::LengthMismatch {
expected: 1024,
actual: 512,
},
NadaError::InvalidSampleRate(0),
NadaError::InvalidChannels(0),
NadaError::Dsp("test".into()),
NadaError::Capture("test".into()),
NadaError::InvalidParameter {
name: "ratio".into(),
value: "-1".into(),
reason: "must be positive".into(),
},
NadaError::Conversion("test".into()),
];
for e in &errors {
let msg = e.to_string();
assert!(!msg.is_empty());
}
}
#[test]
fn error_from_boxed() {
let err: Box<dyn std::error::Error + Send + Sync> = "test error".into();
let nada: NadaError = err.into();
assert!(nada.to_string().contains("test error"));
}
}