pub struct DecodeError {
pub kind: Box<DecodeErrorKind>,
pub codec: Codec,
}Expand description
An error type for failed decoding for every decoder. Abstracts over the different generic and codec-specific errors.
kind field is used to determine the kind of error that occurred.
codec field is used to determine the codec that failed.
backtrace field is used to determine the backtrace of the error.
There is Kind::CodecSpecific variant which wraps the codec-specific
errors as CodecEncodeError type.
§Example
use nom::Needed;
use rasn::{Codec, error::DecodeErrorKind, prelude::*};
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq)]
#[rasn(delegate)]
struct MyString(pub VisibleString);
fn main() {
// Hello, World! in decimal bytes with trailing zeros
// Below sample requires that `backtraces` feature is enabled
let hello_data = vec![
13, 145, 151, 102, 205, 235, 16, 119, 223, 203, 102, 68, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,
];
// Initially parse the first 2 bytes for Error demonstration purposes
let mut total = 2;
loop {
let decoded = Codec::Uper.decode_from_binary::<MyString>(&hello_data[0..hello_data.len().min(total)]);
match decoded {
Ok(succ) => {
println!("Successful decoding!");
println!("Decoded string: {}", succ.0);
break;
}
Err(e) => {
// e is DecodeError, kind is boxed
match *e.kind {
DecodeErrorKind::Incomplete { needed } => {
println!("Codec error source: {}", e.codec);
println!("Error kind: {}", e.kind);
// Here you need to know, that VisibleString has width of 7 bits and UPER parses input
// as bits, if you want to build logic around it, and feed exactly the correct amount of data.
// Usually you might need to just provide one byte at time instead when something is missing, since
// inner logic might not be known to you, and data structures can get complex.
total += match needed {
Needed::Size(n) => {
let missing_bytes = n.get() / 7;
missing_bytes
}
_ => {
#[cfg(feature = "backtraces")]
println!("Backtrace:\n{:?}", e.backtrace);
panic!("Unexpected error! {e:?}");
}
}
}
k => {
#[cfg(feature = "backtraces")]
println!("Backtrace:\n{:?}", e.backtrace);
panic!("Unexpected error! {k:?}");
}
}
}
}
}
}The previous will produce something like following:
Codec error: UPER
Error kind: Need more BITS to continue: (Size(83)).
Successful decoding!
Decoded string: Hello, world!Fields§
§kind: Box<DecodeErrorKind>The kind of decoding error received.
codec: CodecThe codec that returned the error.
Implementations§
Source§impl DecodeError
impl DecodeError
Sourcepub fn permitted_alphabet_error(
reason: PermittedAlphabetError,
codec: Codec,
) -> Self
pub fn permitted_alphabet_error( reason: PermittedAlphabetError, codec: Codec, ) -> Self
Creates a wrapper around a permitted alphabet error from a given codec.
Sourcepub fn size_constraint_not_satisfied(
size: Option<usize>,
expected: String,
codec: Codec,
) -> Self
pub fn size_constraint_not_satisfied( size: Option<usize>, expected: String, codec: Codec, ) -> Self
Creates a wrapper around a size error from a given codec.
Sourcepub fn value_constraint_not_satisfied(
value: BigInt,
expected: Bounded<i128>,
codec: Codec,
) -> Self
pub fn value_constraint_not_satisfied( value: BigInt, expected: Bounded<i128>, codec: Codec, ) -> Self
Creates a wrapper around a value error from a given codec.
Sourcepub fn inner_subtype_constraint_not_satisfied(
reason: InnerSubtypeConstraintError,
codec: Codec,
) -> Self
pub fn inner_subtype_constraint_not_satisfied( reason: InnerSubtypeConstraintError, codec: Codec, ) -> Self
Creates a wrapper around a inner subtype constraint error from a given codec. This is mainly used by standards.
Sourcepub fn discriminant_value_not_found(discriminant: isize, codec: Codec) -> Self
pub fn discriminant_value_not_found(discriminant: isize, codec: Codec) -> Self
Creates a wrapper around a discriminant value error from a given codec.
Sourcepub fn range_exceeds_platform_width(
needed: u32,
present: u32,
codec: Codec,
) -> Self
pub fn range_exceeds_platform_width( needed: u32, present: u32, codec: Codec, ) -> Self
Creates a wrapper around a range value error from a given codec.
Sourcepub fn fixed_string_conversion_failed(
tag: Tag,
actual: usize,
expected: usize,
codec: Codec,
) -> Self
pub fn fixed_string_conversion_failed( tag: Tag, actual: usize, expected: usize, codec: Codec, ) -> Self
Creates a wrapper around a fixed string conversion error from a given codec.
Sourcepub fn incorrect_item_number_in_sequence(
expected: usize,
actual: usize,
codec: Codec,
) -> Self
pub fn incorrect_item_number_in_sequence( expected: usize, actual: usize, codec: Codec, ) -> Self
Creates a wrapper around a sequence item error from a given codec.
Sourcepub fn integer_overflow(max_width: u32, codec: Codec) -> Self
pub fn integer_overflow(max_width: u32, codec: Codec) -> Self
Creates a wrapper around a integer overflow error from a given codec.
Sourcepub fn integer_type_conversion_failed(msg: String, codec: Codec) -> Self
pub fn integer_type_conversion_failed(msg: String, codec: Codec) -> Self
Creates a wrapper around a integer conversion error from a given codec.
Sourcepub fn invalid_bit_string(bits: u8, codec: Codec) -> Self
pub fn invalid_bit_string(bits: u8, codec: Codec) -> Self
Creates a wrapper around a invalid bit string error from a given codec.
Sourcepub fn missing_tag_class_or_value_in_sequence_or_set(
class: Class,
value: u32,
codec: Codec,
) -> Self
pub fn missing_tag_class_or_value_in_sequence_or_set( class: Class, value: u32, codec: Codec, ) -> Self
Creates a wrapper around a missing tag error from a given codec.
Sourcepub fn type_not_extensible(codec: Codec) -> Self
pub fn type_not_extensible(codec: Codec) -> Self
Creates a wrapper around a unexpected non-extensible type error from a given codec.
Sourcepub fn parser_fail(msg: String, codec: Codec) -> Self
pub fn parser_fail(msg: String, codec: Codec) -> Self
Creates a wrapper around a parser error from a given codec.
Sourcepub fn real_not_supported(codec: Codec) -> Self
pub fn real_not_supported(codec: Codec) -> Self
Creates a wrapper around using REAL with unsupported codecs.
Sourcepub fn required_extension_not_present(tag: Tag, codec: Codec) -> Self
pub fn required_extension_not_present(tag: Tag, codec: Codec) -> Self
Creates a wrapper around a missing required extension error from a given codec.
Sourcepub fn enumeration_index_not_found(
index: usize,
extended_list: bool,
codec: Codec,
) -> Self
pub fn enumeration_index_not_found( index: usize, extended_list: bool, codec: Codec, ) -> Self
Creates a wrapper around a missing enum index error from a given codec.
Sourcepub fn choice_index_exceeds_platform_width(
needed: u32,
present: DecodeError,
codec: Codec,
) -> Self
pub fn choice_index_exceeds_platform_width( needed: u32, present: DecodeError, codec: Codec, ) -> Self
Creates a wrapper around a choice index exceeding platform width error from a given codec.
Sourcepub fn length_exceeds_platform_width(msg: String, codec: Codec) -> Self
pub fn length_exceeds_platform_width(msg: String, codec: Codec) -> Self
Creates a wrapper around a length exceeding platform width error from a given codec.
Sourcepub fn choice_index_not_found(
index: usize,
variants: Variants,
codec: Codec,
) -> Self
pub fn choice_index_not_found( index: usize, variants: Variants, codec: Codec, ) -> Self
Creates a wrapper around a missing choice index error from a given codec.
Sourcepub fn string_conversion_failed(tag: Tag, msg: String, codec: Codec) -> Self
pub fn string_conversion_failed(tag: Tag, msg: String, codec: Codec) -> Self
Creates a wrapper around a string conversion error from a given codec.
Sourcepub fn unexpected_extra_data(length: usize, codec: Codec) -> Self
pub fn unexpected_extra_data(length: usize, codec: Codec) -> Self
Creates a wrapper around unexpected extra data error from a given codec.
Sourcepub fn unexpected_empty_input(codec: Codec) -> Self
pub fn unexpected_empty_input(codec: Codec) -> Self
Creates a wrapper around unexpected empty input error from a given codec.
Sourcepub fn assert_length(
expected: usize,
actual: usize,
codec: Codec,
) -> Result<(), DecodeError>
pub fn assert_length( expected: usize, actual: usize, codec: Codec, ) -> Result<(), DecodeError>
Checks whether the length matches, and returns an error if not.
Sourcepub fn from_kind(kind: DecodeErrorKind, codec: Codec) -> Self
pub fn from_kind(kind: DecodeErrorKind, codec: Codec) -> Self
Creates a new error from a given decode error kind and codec.
Trait Implementations§
Source§impl Debug for DecodeError
impl Debug for DecodeError
Source§impl Display for DecodeError
impl Display for DecodeError
Source§impl Error for DecodeError
impl Error for DecodeError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
Source§impl Error for DecodeError
impl Error for DecodeError
Source§fn custom<D: Display>(msg: D, codec: Codec) -> Self
fn custom<D: Display>(msg: D, codec: Codec) -> Self
msg when decoding ASN.1.Source§fn incomplete(needed: Needed, codec: Codec) -> Self
fn incomplete(needed: Needed, codec: Codec) -> Self
Source§fn exceeds_max_length(length: BigUint, codec: Codec) -> Self
fn exceeds_max_length(length: BigUint, codec: Codec) -> Self
Source§fn missing_field(name: &'static str, codec: Codec) -> Self
fn missing_field(name: &'static str, codec: Codec) -> Self
Source§fn no_valid_choice(name: &'static str, codec: Codec) -> Self
fn no_valid_choice(name: &'static str, codec: Codec) -> Self
Source§fn field_error(name: &'static str, nested: DecodeError, codec: Codec) -> Self
fn field_error(name: &'static str, nested: DecodeError, codec: Codec) -> Self
Source§fn duplicate_field(name: &'static str, codec: Codec) -> Self
fn duplicate_field(name: &'static str, codec: Codec) -> Self
Source§impl From<BerDecodeErrorKind> for DecodeError
impl From<BerDecodeErrorKind> for DecodeError
Source§fn from(error: BerDecodeErrorKind) -> Self
fn from(error: BerDecodeErrorKind) -> Self
Source§impl From<CodecDecodeError> for DecodeError
impl From<CodecDecodeError> for DecodeError
Source§fn from(error: CodecDecodeError) -> Self
fn from(error: CodecDecodeError) -> Self
Source§impl From<CoerDecodeErrorKind> for DecodeError
impl From<CoerDecodeErrorKind> for DecodeError
Source§fn from(error: CoerDecodeErrorKind) -> Self
fn from(error: CoerDecodeErrorKind) -> Self
Source§impl From<DerDecodeErrorKind> for DecodeError
impl From<DerDecodeErrorKind> for DecodeError
Source§fn from(error: DerDecodeErrorKind) -> Self
fn from(error: DerDecodeErrorKind) -> Self
Source§impl From<JerDecodeErrorKind> for DecodeError
impl From<JerDecodeErrorKind> for DecodeError
Source§fn from(error: JerDecodeErrorKind) -> Self
fn from(error: JerDecodeErrorKind) -> Self
Source§impl From<OerDecodeErrorKind> for DecodeError
impl From<OerDecodeErrorKind> for DecodeError
Source§fn from(error: OerDecodeErrorKind) -> Self
fn from(error: OerDecodeErrorKind) -> Self
Source§impl From<XerDecodeErrorKind> for DecodeError
impl From<XerDecodeErrorKind> for DecodeError
Source§fn from(error: XerDecodeErrorKind) -> Self
fn from(error: XerDecodeErrorKind) -> Self
Auto Trait Implementations§
impl Freeze for DecodeError
impl RefUnwindSafe for DecodeError
impl Send for DecodeError
impl Sync for DecodeError
impl Unpin for DecodeError
impl UnwindSafe for DecodeError
Blanket Implementations§
Source§impl<T> AsErrorSource for Twhere
T: Error + 'static,
impl<T> AsErrorSource for Twhere
T: Error + 'static,
Source§fn as_error_source(&self) -> &(dyn Error + 'static)
fn as_error_source(&self) -> &(dyn Error + 'static)
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.