use std::{
error::Error as StdError, fmt, io::Error as IoError, num::ParseIntError, result::Result as StdResult,
str::Utf8Error,
};
pub type Result<T> = StdResult<T, Error>;
#[derive(Debug)]
pub enum Error {
InvalidApeVersion,
InvalidItemKeyLen,
InvalidItemKeyValue,
InvalidItemType(u32),
InvalidTagSize,
Io(IoError),
ItemKeyDenied,
ParseItemKey(Utf8Error),
ParseItemBinary,
ParseItemValue(Utf8Error),
ParseLyrics3V2SizeStr(Utf8Error),
ParseLyrics3V2SizeInt(ParseIntError),
TagNotFound,
}
impl StdError for Error {
fn source(&self) -> Option<&(dyn StdError + 'static)> {
Some(match *self {
Self::Io(ref err) => err,
Self::ParseItemKey(ref err) => err,
Self::ParseItemValue(ref err) => err,
Self::ParseLyrics3V2SizeStr(ref err) => err,
Self::ParseLyrics3V2SizeInt(ref err) => err,
_ => return None,
})
}
}
impl fmt::Display for Error {
fn fmt(&self, out: &mut fmt::Formatter) -> fmt::Result {
match *self {
Self::InvalidApeVersion => write!(out, "invalid APE version"),
Self::InvalidItemKeyLen => write!(out, "item keys can have a length of 2 up to 255 characters"),
Self::InvalidItemKeyValue => write!(out, "item key contains non-ascii characters"),
Self::InvalidItemType(value) => write!(out, "invalid item type: {value}"),
Self::InvalidTagSize => write!(out, "APE header contains invalid tag size"),
Self::Io(ref err) => write!(out, "{err}"),
Self::ItemKeyDenied => write!(out, "not allowed are the following keys: ID3, TAG, OggS and MP+"),
Self::ParseItemKey(ref err) => write!(out, "parse item key: {err}"),
Self::ParseItemBinary => write!(out, "can not convert a binary value to an UTF-8 string"),
Self::ParseItemValue(ref err) => write!(out, "parse item value: {err}"),
Self::ParseLyrics3V2SizeStr(ref err) => write!(out, "parse Lyrics3V2 size: {}", err),
Self::ParseLyrics3V2SizeInt(ref err) => write!(out, "parse Lyrics3V2 size: {}", err),
Self::TagNotFound => write!(out, "APE tag does not exist"),
}
}
}
impl From<IoError> for Error {
fn from(error: IoError) -> Self {
Self::Io(error)
}
}