use thiserror::Error;
#[derive(Clone, Copy, Debug, Eq, Error, Hash, PartialEq)]
pub enum CodecDecodeError<E> {
#[error("codec decode error at input index {input_index}: {source}")]
Decode {
#[source]
source: E,
input_index: usize,
},
#[error("incomplete input at index {input_index}: required {required_total} units, available {available}")]
Incomplete {
input_index: usize,
required_total: usize,
available: usize,
},
#[error("trailing input after decoded value: consumed {consumed} units, remaining {remaining}")]
TrailingInput {
consumed: usize,
remaining: usize,
},
#[error("invalid input index {index} for input length {len}")]
InvalidInputIndex {
index: usize,
len: usize,
},
#[error("invalid output index {index} for output length {len}")]
InvalidOutputIndex {
index: usize,
len: usize,
},
}
impl<E> CodecDecodeError<E> {
#[must_use]
#[inline(always)]
pub const fn decode(source: E, input_index: usize) -> Self {
Self::Decode { source, input_index }
}
#[must_use]
#[inline(always)]
pub const fn incomplete(input_index: usize, required_total: usize, available: usize) -> Self {
Self::Incomplete {
input_index,
required_total,
available,
}
}
#[must_use]
#[inline(always)]
pub const fn trailing_input(consumed: usize, remaining: usize) -> Self {
Self::TrailingInput { consumed, remaining }
}
#[must_use]
#[inline(always)]
pub const fn invalid_input_index(index: usize, len: usize) -> Self {
Self::InvalidInputIndex { index, len }
}
#[must_use]
#[inline(always)]
pub const fn invalid_output_index(index: usize, len: usize) -> Self {
Self::InvalidOutputIndex { index, len }
}
}