use alloc::string::String;
use core::fmt;
use enough::StopReason;
use whereat::At;
pub type Result<T> = core::result::Result<T, At<Error>>;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum Error {
InvalidInput(String),
EncodeFailed(EncodingError),
DecodeFailed(DecodingError),
InvalidConfig(String),
OutOfMemory,
IccError(String),
MuxError(MuxError),
AnimationError(String),
NeedMoreData,
InvalidWebP,
Stopped(StopReason),
IoError(String),
LimitExceeded(crate::LimitExceeded),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::InvalidInput(msg) => write!(f, "invalid input: {}", msg),
Error::EncodeFailed(e) => write!(f, "encode failed: {}", e),
Error::DecodeFailed(e) => write!(f, "decode failed: {}", e),
Error::InvalidConfig(msg) => write!(f, "invalid config: {}", msg),
Error::OutOfMemory => write!(f, "out of memory"),
Error::IccError(msg) => write!(f, "ICC error: {}", msg),
Error::MuxError(e) => write!(f, "mux error: {}", e),
Error::AnimationError(msg) => write!(f, "animation error: {}", msg),
Error::NeedMoreData => write!(f, "need more data"),
Error::InvalidWebP => write!(f, "invalid WebP data"),
Error::Stopped(reason) => write!(f, "{}", reason),
Error::IoError(msg) => write!(f, "I/O error: {}", msg),
Error::LimitExceeded(e) => write!(f, "limit exceeded: {}", e),
}
}
}
impl From<crate::LimitExceeded> for Error {
fn from(e: crate::LimitExceeded) -> Self {
Error::LimitExceeded(e)
}
}
impl From<StopReason> for Error {
fn from(reason: StopReason) -> Self {
Error::Stopped(reason)
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[repr(i32)]
pub enum EncodingError {
Ok = 0,
OutOfMemory = 1,
BitstreamOutOfMemory = 2,
NullParameter = 3,
InvalidConfiguration = 4,
BadDimension = 5,
Partition0Overflow = 6,
PartitionOverflow = 7,
BadWrite = 8,
FileTooBig = 9,
UserAbort = 10,
Last = 11,
}
impl From<i32> for EncodingError {
fn from(code: i32) -> Self {
match code {
0 => EncodingError::Ok,
1 => EncodingError::OutOfMemory,
2 => EncodingError::BitstreamOutOfMemory,
3 => EncodingError::NullParameter,
4 => EncodingError::InvalidConfiguration,
5 => EncodingError::BadDimension,
6 => EncodingError::Partition0Overflow,
7 => EncodingError::PartitionOverflow,
8 => EncodingError::BadWrite,
9 => EncodingError::FileTooBig,
10 => EncodingError::UserAbort,
_ => EncodingError::Last,
}
}
}
impl fmt::Display for EncodingError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let msg = match self {
EncodingError::Ok => "ok",
EncodingError::OutOfMemory => "out of memory",
EncodingError::BitstreamOutOfMemory => "bitstream out of memory",
EncodingError::NullParameter => "null parameter",
EncodingError::InvalidConfiguration => "invalid configuration",
EncodingError::BadDimension => "bad dimension",
EncodingError::Partition0Overflow => "partition0 overflow",
EncodingError::PartitionOverflow => "partition overflow",
EncodingError::BadWrite => "bad write",
EncodingError::FileTooBig => "file too big",
EncodingError::UserAbort => "user abort",
EncodingError::Last => "unknown error",
};
write!(f, "{}", msg)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[repr(i32)]
pub enum DecodingError {
Ok = 0,
OutOfMemory = 1,
InvalidParam = 2,
BitstreamError = 3,
UnsupportedFeature = 4,
Suspended = 5,
UserAbort = 6,
NotEnoughData = 7,
}
impl From<i32> for DecodingError {
fn from(code: i32) -> Self {
match code {
0 => DecodingError::Ok,
1 => DecodingError::OutOfMemory,
2 => DecodingError::InvalidParam,
3 => DecodingError::BitstreamError,
4 => DecodingError::UnsupportedFeature,
5 => DecodingError::Suspended,
6 => DecodingError::UserAbort,
_ => DecodingError::NotEnoughData,
}
}
}
impl fmt::Display for DecodingError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let msg = match self {
DecodingError::Ok => "ok",
DecodingError::OutOfMemory => "out of memory",
DecodingError::InvalidParam => "invalid param",
DecodingError::BitstreamError => "bitstream error",
DecodingError::UnsupportedFeature => "unsupported feature",
DecodingError::Suspended => "suspended",
DecodingError::UserAbort => "user abort",
DecodingError::NotEnoughData => "not enough data",
};
write!(f, "{}", msg)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
#[repr(i32)]
pub enum MuxError {
Ok = 1,
NotFound = 0,
InvalidArgument = -1,
BadData = -2,
MemoryError = -3,
NotEnoughData = -4,
}
impl From<i32> for MuxError {
fn from(code: i32) -> Self {
match code {
1 => MuxError::Ok,
0 => MuxError::NotFound,
-1 => MuxError::InvalidArgument,
-2 => MuxError::BadData,
-3 => MuxError::MemoryError,
_ => MuxError::NotEnoughData,
}
}
}
impl fmt::Display for MuxError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let msg = match self {
MuxError::Ok => "ok",
MuxError::NotFound => "not found",
MuxError::InvalidArgument => "invalid argument",
MuxError::BadData => "bad data",
MuxError::MemoryError => "memory error",
MuxError::NotEnoughData => "not enough data",
};
write!(f, "{}", msg)
}
}