use core::num::NonZeroUsize;
use super::internal::decode_step::DecodeStep;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub enum DecodeInvalidAction<Value> {
Skip {
consumed: NonZeroUsize,
},
Emit {
value: Value,
consumed: NonZeroUsize,
},
}
impl<Value> DecodeInvalidAction<Value> {
#[inline]
#[must_use]
pub(super) fn into_step(
self,
input_index: usize,
available: usize,
) -> DecodeStep<Value> {
match self {
Self::Skip { consumed } => {
DecodeStep::skipped(Self::bound_consumed(consumed, available))
}
Self::Emit { value, consumed } => DecodeStep::decoded(
value,
Self::bound_consumed(consumed, available),
input_index,
),
}
}
#[inline(always)]
#[must_use]
fn bound_consumed(
consumed: NonZeroUsize,
available: usize,
) -> NonZeroUsize {
assert!(
available > 0,
"DecodeInvalidAction cannot consume empty input",
);
assert!(
consumed.get() <= available,
"DecodeInvalidAction consumed units must not exceed available input",
);
consumed
}
}