use core::num::NonZeroUsize;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum DecodeFailure<E> {
Incomplete {
required_total: NonZeroUsize,
},
Invalid {
source: E,
consumed: Option<NonZeroUsize>,
},
}
impl<E> DecodeFailure<E> {
#[inline(always)]
#[must_use]
pub const fn incomplete(required_total: NonZeroUsize) -> Self {
Self::Incomplete { required_total }
}
#[inline(always)]
#[must_use]
pub const fn invalid(source: E, consumed: NonZeroUsize) -> Self {
Self::Invalid {
source,
consumed: Some(consumed),
}
}
#[inline(always)]
#[must_use]
pub const fn invalid_without_consumed(source: E) -> Self {
Self::Invalid {
source,
consumed: None,
}
}
#[inline(always)]
#[must_use]
pub const fn required_total(&self) -> Option<NonZeroUsize> {
match self {
Self::Incomplete { required_total } => Some(*required_total),
Self::Invalid { .. } => None,
}
}
#[inline(always)]
#[must_use]
pub const fn invalid_source(&self) -> Option<&E> {
match self {
Self::Invalid { source, .. } => Some(source),
Self::Incomplete { .. } => None,
}
}
#[inline(always)]
#[must_use]
pub const fn consumed_units(&self) -> Option<NonZeroUsize> {
match self {
Self::Invalid { consumed, .. } => *consumed,
Self::Incomplete { .. } => None,
}
}
}