use crossbeam_channel::{RecvError, RecvTimeoutError, TryRecvError};
use rodio::{decoder::DecoderError, PlayError, StreamError};
use std::{env::VarError, io::Error as IOError};
use thiserror::Error;
use toml::de::Error as TOMLError;
pub mod in_out;
pub mod serde;
pub mod playback;
mod utilities;
#[derive(Error, Debug)]
#[doc = env!("CARGO_PKG_NAME")]
#[cfg_attr(
any(debug_assertions, feature = "traits"),
derive(PartialEq, Eq, PartialOrd, Ord),
derive(Hash)
)]
pub enum VectorError {
#[error("Index out of bounds")]
OutOfBounds,
#[error("Empty vector encountered.")]
Empty,
}
#[derive(Error, Debug)]
#[cfg_attr(
any(debug_assertions, feature = "traits"),
derive(PartialEq, Eq, PartialOrd, Ord),
derive(Hash)
)]
#[derive(Default)]
pub enum ChannelError {
#[error("A Channel-Timeout occurred.")]
Timeout,
#[error("A Channel is empty.")]
Empty,
#[error("A Channel disconnected.")]
#[default]
Disconnect,
}
#[derive(Error, Debug)]
pub enum Error {
#[error("IO: {0}")]
Io(#[from] IOError),
#[error("Rodio-Decode: {0}")]
Decode(#[from] DecoderError),
#[error("Rodio-Play: {0}")]
Play(#[from] PlayError),
#[error("Rodio-Stream: {0}")]
Stream(#[from] StreamError),
#[error("TOML: {0}")]
Deserialise(#[from] TOMLError),
#[error("Variable: {0}")]
Variable(#[from] VarError),
#[error("Vector: {0}")]
Vector(#[from] VectorError),
#[error("Channel: {0}")]
Channel(#[from] ChannelError),
}
impl From<RecvTimeoutError> for ChannelError {
#[inline(always)]
fn from(error: RecvTimeoutError) -> Self {
match error {
RecvTimeoutError::Timeout => Self::Timeout,
RecvTimeoutError::Disconnected => Self::Disconnect,
}
}
}
impl From<()> for ChannelError {
#[inline(always)]
fn from(_: ()) -> Self {
Self::default()
}
}
impl From<RecvError> for ChannelError {
#[inline(always)]
fn from(_: RecvError) -> Self {
().into()
}
}
impl From<TryRecvError> for ChannelError {
#[inline(always)]
fn from(error: TryRecvError) -> Self {
match error {
TryRecvError::Empty => Self::Empty,
TryRecvError::Disconnected => Self::Disconnect,
}
}
}