use std::error;
use std::fmt;
use std::io;
use std::result;
#[non_exhaustive]
#[derive(Debug)]
pub enum SeekErrorKind {
Unseekable,
ForwardOnly,
OutOfRange,
InvalidTrack,
}
impl SeekErrorKind {
fn as_str(&self) -> &'static str {
match *self {
SeekErrorKind::Unseekable => "stream is not seekable",
SeekErrorKind::ForwardOnly => "stream can only be seeked forward",
SeekErrorKind::OutOfRange => "requested seek timestamp is out-of-range for stream",
SeekErrorKind::InvalidTrack => "invalid track id",
}
}
}
#[non_exhaustive]
#[derive(Debug)]
pub enum Error {
IoError(std::io::Error),
DecodeError(&'static str),
SeekError(SeekErrorKind),
Unsupported(&'static str),
LimitError(&'static str),
ResetRequired,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::IoError(ref err) => err.fmt(f),
Error::DecodeError(msg) => {
write!(f, "malformed stream: {msg}")
}
Error::SeekError(ref kind) => {
write!(f, "seek error: {}", kind.as_str())
}
Error::Unsupported(feature) => {
write!(f, "unsupported feature: {feature}")
}
Error::LimitError(constraint) => {
write!(f, "limit reached: {constraint}")
}
Error::ResetRequired => {
write!(f, "decoder needs to be reset")
}
}
}
}
impl std::error::Error for Error {
fn cause(&self) -> Option<&dyn error::Error> {
match *self {
Error::IoError(ref err) => Some(err),
Error::DecodeError(_) => None,
Error::SeekError(_) => None,
Error::Unsupported(_) => None,
Error::LimitError(_) => None,
Error::ResetRequired => None,
}
}
}
impl From<io::Error> for Error {
fn from(err: io::Error) -> Error {
Error::IoError(err)
}
}
pub type Result<T> = result::Result<T, Error>;
pub fn decode_error<T>(desc: &'static str) -> Result<T> {
Err(Error::DecodeError(desc))
}
pub fn seek_error<T>(kind: SeekErrorKind) -> Result<T> {
Err(Error::SeekError(kind))
}
pub fn unsupported_error<T>(feature: &'static str) -> Result<T> {
Err(Error::Unsupported(feature))
}
pub fn limit_error<T>(constraint: &'static str) -> Result<T> {
Err(Error::LimitError(constraint))
}
pub fn reset_error<T>() -> Result<T> {
Err(Error::ResetRequired)
}