use core::num::NonZeroUsize;
use thiserror::Error;
use super::super::capacity_error::CapacityError;
use super::super::transcode_domain_error::TranscodeDomainError;
use super::super::transcode_failure::TranscodeFailure;
use crate::Codec;
use crate::DecodeFailure;
pub type TranscodeDecodeErrorOf<C> = TranscodeDecodeError<<C as Codec>::DecodeError>;
#[derive(Clone, Debug, Eq, Error, Hash, PartialEq)]
#[must_use]
pub enum TranscodeDecodeError<E> {
#[error(transparent)]
Failure(
#[from]
TranscodeFailure,
),
#[error(transparent)]
Domain(
#[from]
TranscodeDomainError<E>,
),
}
impl<E> TranscodeDecodeError<E> {
#[inline]
pub const fn domain_reset(source: E) -> Self {
Self::Domain(TranscodeDomainError::reset(source))
}
#[inline]
pub const fn domain_main(source: E, input_index: usize) -> Self {
Self::Domain(TranscodeDomainError::main(source, input_index))
}
#[inline]
pub const fn domain_main_with_consumed(
source: E,
input_index: usize,
input_consumed: Option<NonZeroUsize>,
) -> Self {
Self::Domain(TranscodeDomainError::main_with_consumed(
source,
input_index,
input_consumed,
))
}
#[inline]
pub const fn domain_finish(source: E) -> Self {
Self::Domain(TranscodeDomainError::finish(source))
}
#[inline]
pub fn from_decode_failure(failure: DecodeFailure<E>, input_index: usize, available: usize) -> Self {
match failure {
DecodeFailure::Incomplete {
source: Some(source), ..
} => Self::domain_main(source, input_index),
DecodeFailure::Incomplete { required_total, .. } => {
TranscodeFailure::incomplete_input(input_index, required_total.get(), available).into()
}
DecodeFailure::Invalid { source, consumed } => {
Self::domain_main_with_consumed(source, input_index, consumed)
}
}
}
#[inline]
#[must_use]
pub const fn is_domain(&self) -> bool {
matches!(self, Self::Domain(_))
}
#[inline]
pub const fn failure_ref(&self) -> Option<&TranscodeFailure> {
match self {
Self::Failure(failure) => Some(failure),
Self::Domain(_) => None,
}
}
#[inline]
pub const fn domain_error_ref(&self) -> Option<&TranscodeDomainError<E>> {
match self {
Self::Domain(error) => Some(error),
Self::Failure(_) => None,
}
}
#[inline]
pub const fn domain_ref(&self) -> Option<&E> {
match self {
Self::Domain(error) => Some(error.source()),
Self::Failure(_) => None,
}
}
#[inline]
pub fn map_domain<F, T>(self, f: F) -> TranscodeDecodeError<T>
where
F: FnOnce(E) -> T,
{
match self {
Self::Failure(failure) => TranscodeDecodeError::Failure(failure),
Self::Domain(error) => TranscodeDecodeError::Domain(error.map_source(f)),
}
}
}
impl<E> From<CapacityError> for TranscodeDecodeError<E> {
#[inline]
fn from(error: CapacityError) -> Self {
TranscodeFailure::from(error).into()
}
}