use core::fmt;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum HtSegmentLengthError {
EmptyContributionHasSegments,
ContributionLengthExceedsU32 {
data_len: usize,
},
RefinementOnlyLengthMismatch {
data_len: u32,
refinement_length: u32,
},
RefinementLengthOutOfRange {
refinement_length: u32,
},
SinglePassHasRefinement {
refinement_length: u32,
},
SinglePassLengthMismatch {
data_len: u32,
cleanup_length: u32,
},
MultiPassRequiresSegments {
cleanup_length: u32,
refinement_length: u32,
},
MultiPassLengthOverflow {
cleanup_length: u32,
refinement_length: u32,
},
MultiPassLengthMismatch {
data_len: u32,
cleanup_length: u32,
refinement_length: u32,
},
CleanupLengthOutOfRange {
cleanup_length: u32,
},
}
impl HtSegmentLengthError {
#[must_use]
pub const fn reason(self) -> &'static str {
match self {
Self::EmptyContributionHasSegments => {
"empty HTJ2K packet contribution must not carry segment bytes"
}
Self::ContributionLengthExceedsU32 { .. } => {
"HTJ2K packet contribution exceeds u32 length"
}
Self::RefinementOnlyLengthMismatch { .. } => {
"refinement-only HTJ2K packet contribution length mismatch"
}
Self::RefinementLengthOutOfRange { .. } => {
"HTJ2K refinement segment length is out of range"
}
Self::SinglePassHasRefinement { .. } => {
"single-pass HTJ2K packet contribution must not carry refinement bytes"
}
Self::SinglePassLengthMismatch { .. } => {
"single-pass HTJ2K packet contribution length mismatch"
}
Self::MultiPassRequiresSegments { .. } => {
"multi-pass HTJ2K packet contribution requires cleanup/refinement lengths"
}
Self::MultiPassLengthOverflow { .. } => {
"multi-pass HTJ2K packet contribution length overflow"
}
Self::MultiPassLengthMismatch { .. } => {
"multi-pass HTJ2K packet contribution length mismatch"
}
Self::CleanupLengthOutOfRange { .. } => "HTJ2K cleanup segment length is out of range",
}
}
}
impl fmt::Display for HtSegmentLengthError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
match *self {
Self::EmptyContributionHasSegments => formatter.write_str(self.reason()),
Self::ContributionLengthExceedsU32 { data_len } => {
write!(formatter, "{}: {data_len} bytes", self.reason())
}
Self::RefinementOnlyLengthMismatch {
data_len,
refinement_length,
} => write!(
formatter,
"{}: payload {data_len}, refinement {refinement_length}",
self.reason()
),
Self::RefinementLengthOutOfRange { refinement_length }
| Self::SinglePassHasRefinement { refinement_length } => {
write!(formatter, "{}: {refinement_length}", self.reason())
}
Self::SinglePassLengthMismatch {
data_len,
cleanup_length,
} => write!(
formatter,
"{}: payload {data_len}, cleanup {cleanup_length}",
self.reason()
),
Self::MultiPassRequiresSegments {
cleanup_length,
refinement_length,
}
| Self::MultiPassLengthOverflow {
cleanup_length,
refinement_length,
} => write!(
formatter,
"{}: cleanup {cleanup_length}, refinement {refinement_length}",
self.reason()
),
Self::MultiPassLengthMismatch {
data_len,
cleanup_length,
refinement_length,
} => write!(
formatter,
"{}: payload {data_len}, cleanup {cleanup_length}, refinement {refinement_length}",
self.reason()
),
Self::CleanupLengthOutOfRange { cleanup_length } => {
write!(formatter, "{}: {cleanup_length}", self.reason())
}
}
}
}
impl core::error::Error for HtSegmentLengthError {}