use thiserror::Error as ThisError;
#[derive(Debug, ThisError)]
pub enum Error {
#[error("IO error: `{0}`")]
Io(#[from] std::io::Error),
#[error("Stream error: `{0}`")]
Stream(#[from] rodio::StreamError),
#[error("Decode error: `{0}`")]
Decode(#[from] rodio::decoder::DecoderError),
#[error("Play error: `{0}`")]
Play(#[from] rodio::PlayError),
#[error("Device error: `{0}`")]
Devices(#[from] rodio::DevicesError),
#[error("Device name error: `{0}`")]
DeviceName(#[from] rodio::cpal::DeviceNameError),
#[error("`{0}` output device not found.")]
DeviceNotFound(String),
#[error("Embedded error: `{0}`")]
Embedded(String),
#[error("Log directive parse error: `{0}`")]
DirectiveParse(#[from] tracing_subscriber::filter::ParseError),
#[error("TOML parse error: `{0}`")]
TomlParse(#[from] toml::de::Error),
#[error("UTF-8 error: `{0}`")]
Utf8(#[from] std::str::Utf8Error),
#[error("Preset not found: `{0}`")]
PresetNotFound(String),
#[error("No audio files to play")]
NoAudioFiles,
#[error("Regex: `{0}`")]
Regex(#[from] regex::Error),
}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use std::io::{Error as IoError, ErrorKind};
#[test]
fn test_error() {
let message = "your computer is on fire!";
let error = Error::from(IoError::new(ErrorKind::Other, message));
assert_eq!(format!("IO error: `{message}`"), error.to_string());
assert_eq!(
format!("\"IO error: `{message}`\""),
format!("{:?}", error.to_string())
);
}
}