use core::num::NonZeroUsize;
use std::string::FromUtf8Error;
use crate::base64_error_kind::Base64ErrorKind;
use ::base64::DecodeError;
use qubit_codec::DecodeFailure;
use thiserror::Error;
pub type MiscCodecResult<T> = Result<T, MiscCodecError>;
#[derive(Debug, Error)]
pub enum MiscCodecError {
#[error("invalid Base64 input ({kind:?}): {source}")]
InvalidBase64 {
kind: Base64ErrorKind,
input_index: Option<usize>,
symbol: Option<u8>,
input_length: Option<usize>,
#[source]
source: DecodeError,
},
#[error("missing required prefix '{prefix}'")]
MissingPrefix {
prefix: String,
},
#[error("invalid radix-{radix} digit '{character}' at index {index}")]
InvalidDigit {
radix: u32,
index: usize,
character: char,
},
#[error("invalid length for {context}: expected {expected}, got {actual}")]
InvalidLength {
context: &'static str,
expected: String,
actual: usize,
},
#[error("invalid escape {escape:?} at index {index}: {reason}")]
InvalidEscape {
index: usize,
escape: String,
reason: String,
},
#[error("invalid character '{character}' at index {index}: {reason}")]
InvalidCharacter {
index: usize,
character: char,
reason: String,
},
#[error("invalid {codec} input: {reason}")]
InvalidInput {
codec: &'static str,
reason: String,
},
#[error("decoded bytes are not valid UTF-8: {source}")]
InvalidUtf8 {
#[from]
source: FromUtf8Error,
},
}
impl From<DecodeError> for MiscCodecError {
#[inline]
fn from(source: DecodeError) -> Self {
Self::InvalidBase64 {
kind: Base64ErrorKind::from_decode_error(&source),
input_index: Base64ErrorKind::input_index(&source),
symbol: Base64ErrorKind::symbol(&source),
input_length: Base64ErrorKind::input_length(&source),
source,
}
}
}
#[inline]
pub(crate) fn map_misc_decode_failure_with_consumed(
error: MiscCodecError,
consumed: NonZeroUsize,
) -> DecodeFailure<MiscCodecError> {
DecodeFailure::invalid(error, consumed)
}