use std::error::Error;
use std::fmt::Display;
#[derive(Debug, Copy, Clone, Ord, PartialOrd, Eq, PartialEq)]
pub struct MismatchedSize {
pub expected: usize,
pub received: usize,
}
#[derive(Debug, Clone, Ord, PartialOrd, Eq, PartialEq)]
pub enum ForgeError {
LaneSizeMismatch,
LaneMultipleOfChannels,
InvalidIcc,
InvalidTrcCurve,
InvalidCicp,
CurveLutIsTooLarge,
ParametricCurveZeroDivision,
InvalidRenderingIntent,
DivisionByZero,
UnsupportedColorPrimaries(u8),
UnsupportedTrc(u8),
InvalidGainMapConfiguration,
ImageSizeMismatch,
ZeroBaseSize,
UnsupportedToneMappingConfiguration(String),
MinimumSliceSizeMismatch(MismatchedSize),
MinimumStrideSizeMismatch(MismatchedSize),
UnknownError,
}
impl Display for ForgeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ForgeError::LaneSizeMismatch => write!(f, "Lanes length must match"),
ForgeError::LaneMultipleOfChannels => {
write!(f, "Lane length must not be multiple of channel count")
}
ForgeError::InvalidIcc => f.write_str("Invalid ICC profile"),
ForgeError::InvalidCicp => f.write_str("Invalid CICP in ICC profile"),
ForgeError::InvalidTrcCurve => f.write_str("Invalid TRC curve"),
ForgeError::CurveLutIsTooLarge => f.write_str("Curve Lut is too large"),
ForgeError::ParametricCurveZeroDivision => {
f.write_str("Parametric Curve definition causes division by zero")
}
ForgeError::InvalidRenderingIntent => f.write_str("Invalid rendering intent"),
ForgeError::DivisionByZero => f.write_str("Division by zero"),
ForgeError::UnsupportedColorPrimaries(value) => {
f.write_fmt(format_args!("Unsupported color primaries, {value}"))
}
ForgeError::UnsupportedTrc(value) => write!(f, "Unsupported TRC {value}"),
ForgeError::InvalidGainMapConfiguration => {
f.write_str("Invalid Gain map configuration")
}
ForgeError::ImageSizeMismatch => f.write_str("Image size does not match"),
ForgeError::ZeroBaseSize => f.write_str("Image size must not be zero"),
ForgeError::MinimumSliceSizeMismatch(size) => f.write_fmt(format_args!(
"Minimum image slice size mismatch: expected={}, received={}",
size.expected, size.received
)),
ForgeError::MinimumStrideSizeMismatch(size) => f.write_fmt(format_args!(
"Minimum stride must have size at least {} but it is {}",
size.expected, size.received
)),
ForgeError::UnsupportedToneMappingConfiguration(str) => f.write_str(str),
ForgeError::UnknownError => f.write_str("Unknown error"),
}
}
}
impl Error for ForgeError {}