pub struct RasnDecodeError {
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,
) -> DecodeError
pub fn permitted_alphabet_error( reason: PermittedAlphabetError, codec: Codec, ) -> DecodeError
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,
) -> DecodeError
pub fn size_constraint_not_satisfied( size: Option<usize>, expected: String, codec: Codec, ) -> DecodeError
Creates a wrapper around a size error from a given codec.
Sourcepub fn value_constraint_not_satisfied(
value: BigInt,
expected: Bounded<i128>,
codec: Codec,
) -> DecodeError
pub fn value_constraint_not_satisfied( value: BigInt, expected: Bounded<i128>, codec: Codec, ) -> DecodeError
Creates a wrapper around a value error from a given codec.
Sourcepub fn inner_subtype_constraint_not_satisfied(
reason: InnerSubtypeConstraintError,
codec: Codec,
) -> DecodeError
pub fn inner_subtype_constraint_not_satisfied( reason: InnerSubtypeConstraintError, codec: Codec, ) -> DecodeError
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,
) -> DecodeError
pub fn discriminant_value_not_found( discriminant: isize, codec: Codec, ) -> DecodeError
Creates a wrapper around a discriminant value error from a given codec.
Sourcepub fn range_exceeds_platform_width(
needed: u32,
present: u32,
codec: Codec,
) -> DecodeError
pub fn range_exceeds_platform_width( needed: u32, present: u32, codec: Codec, ) -> DecodeError
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,
) -> DecodeError
pub fn fixed_string_conversion_failed( tag: Tag, actual: usize, expected: usize, codec: Codec, ) -> DecodeError
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,
) -> DecodeError
pub fn incorrect_item_number_in_sequence( expected: usize, actual: usize, codec: Codec, ) -> DecodeError
Creates a wrapper around a sequence item error from a given codec.
Sourcepub fn integer_overflow(max_width: u32, codec: Codec) -> DecodeError
pub fn integer_overflow(max_width: u32, codec: Codec) -> DecodeError
Creates a wrapper around a integer overflow error from a given codec.
Sourcepub fn integer_type_conversion_failed(msg: String, codec: Codec) -> DecodeError
pub fn integer_type_conversion_failed(msg: String, codec: Codec) -> DecodeError
Creates a wrapper around a integer conversion error from a given codec.
Sourcepub fn invalid_bit_string(bits: u8, codec: Codec) -> DecodeError
pub fn invalid_bit_string(bits: u8, codec: Codec) -> DecodeError
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,
) -> DecodeError
pub fn missing_tag_class_or_value_in_sequence_or_set( class: Class, value: u32, codec: Codec, ) -> DecodeError
Creates a wrapper around a missing tag error from a given codec.
Sourcepub fn type_not_extensible(codec: Codec) -> DecodeError
pub fn type_not_extensible(codec: Codec) -> DecodeError
Creates a wrapper around a unexpected non-extensible type error from a given codec.
Sourcepub fn parser_fail(msg: String, codec: Codec) -> DecodeError
pub fn parser_fail(msg: String, codec: Codec) -> DecodeError
Creates a wrapper around a parser error from a given codec.
Sourcepub fn real_not_supported(codec: Codec) -> DecodeError
pub fn real_not_supported(codec: Codec) -> DecodeError
Creates a wrapper around using REAL with unsupported codecs.
Sourcepub fn required_extension_not_present(tag: Tag, codec: Codec) -> DecodeError
pub fn required_extension_not_present(tag: Tag, codec: Codec) -> DecodeError
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,
) -> DecodeError
pub fn enumeration_index_not_found( index: usize, extended_list: bool, codec: Codec, ) -> DecodeError
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,
) -> DecodeError
pub fn choice_index_exceeds_platform_width( needed: u32, present: DecodeError, codec: Codec, ) -> DecodeError
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) -> DecodeError
pub fn length_exceeds_platform_width(msg: String, codec: Codec) -> DecodeError
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,
) -> DecodeError
pub fn choice_index_not_found( index: usize, variants: Variants, codec: Codec, ) -> DecodeError
Creates a wrapper around a missing choice index error from a given codec.
Sourcepub fn string_conversion_failed(
tag: Tag,
msg: String,
codec: Codec,
) -> DecodeError
pub fn string_conversion_failed( tag: Tag, msg: String, codec: Codec, ) -> DecodeError
Creates a wrapper around a string conversion error from a given codec.
Sourcepub fn unexpected_extra_data(length: usize, codec: Codec) -> DecodeError
pub fn unexpected_extra_data(length: usize, codec: Codec) -> DecodeError
Creates a wrapper around unexpected extra data error from a given codec.
Sourcepub fn unexpected_empty_input(codec: Codec) -> DecodeError
pub fn unexpected_empty_input(codec: Codec) -> DecodeError
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) -> DecodeError
pub fn from_kind(kind: DecodeErrorKind, codec: Codec) -> DecodeError
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
use the Display impl or to_string()
Source§impl Error for DecodeError
impl Error for DecodeError
Source§fn custom<D>(msg: D, codec: Codec) -> DecodeErrorwhere
D: Display,
fn custom<D>(msg: D, codec: Codec) -> DecodeErrorwhere
D: Display,
msg when decoding ASN.1.Source§fn incomplete(needed: Needed, codec: Codec) -> DecodeError
fn incomplete(needed: Needed, codec: Codec) -> DecodeError
Source§fn exceeds_max_length(length: BigUint, codec: Codec) -> DecodeError
fn exceeds_max_length(length: BigUint, codec: Codec) -> DecodeError
Source§fn missing_field(name: &'static str, codec: Codec) -> DecodeError
fn missing_field(name: &'static str, codec: Codec) -> DecodeError
Source§fn no_valid_choice(name: &'static str, codec: Codec) -> DecodeError
fn no_valid_choice(name: &'static str, codec: Codec) -> DecodeError
Source§fn field_error(
name: &'static str,
nested: DecodeError,
codec: Codec,
) -> DecodeError
fn field_error( name: &'static str, nested: DecodeError, codec: Codec, ) -> DecodeError
Source§fn duplicate_field(name: &'static str, codec: Codec) -> DecodeError
fn duplicate_field(name: &'static str, codec: Codec) -> DecodeError
Source§fn unknown_field(index: usize, tag: Tag, codec: Codec) -> DecodeError
fn unknown_field(index: usize, tag: Tag, codec: Codec) -> DecodeError
Source§impl From<AperDecodeErrorKind> for DecodeError
impl From<AperDecodeErrorKind> for DecodeError
Source§fn from(error: AperDecodeErrorKind) -> DecodeError
fn from(error: AperDecodeErrorKind) -> DecodeError
Source§impl From<BerDecodeErrorKind> for DecodeError
impl From<BerDecodeErrorKind> for DecodeError
Source§fn from(error: BerDecodeErrorKind) -> DecodeError
fn from(error: BerDecodeErrorKind) -> DecodeError
Source§impl From<CerDecodeErrorKind> for DecodeError
impl From<CerDecodeErrorKind> for DecodeError
Source§fn from(error: CerDecodeErrorKind) -> DecodeError
fn from(error: CerDecodeErrorKind) -> DecodeError
Source§impl From<CodecDecodeError> for DecodeError
impl From<CodecDecodeError> for DecodeError
Source§fn from(error: CodecDecodeError) -> DecodeError
fn from(error: CodecDecodeError) -> DecodeError
Source§impl From<CoerDecodeErrorKind> for DecodeError
impl From<CoerDecodeErrorKind> for DecodeError
Source§fn from(error: CoerDecodeErrorKind) -> DecodeError
fn from(error: CoerDecodeErrorKind) -> DecodeError
Source§impl From<DecodeError> for Error
impl From<DecodeError> for Error
Source§fn from(source: RasnDecodeError) -> Self
fn from(source: RasnDecodeError) -> Self
Source§impl From<DerDecodeErrorKind> for DecodeError
impl From<DerDecodeErrorKind> for DecodeError
Source§fn from(error: DerDecodeErrorKind) -> DecodeError
fn from(error: DerDecodeErrorKind) -> DecodeError
Source§impl From<JerDecodeErrorKind> for DecodeError
impl From<JerDecodeErrorKind> for DecodeError
Source§fn from(error: JerDecodeErrorKind) -> DecodeError
fn from(error: JerDecodeErrorKind) -> DecodeError
Source§impl From<OerDecodeErrorKind> for DecodeError
impl From<OerDecodeErrorKind> for DecodeError
Source§fn from(error: OerDecodeErrorKind) -> DecodeError
fn from(error: OerDecodeErrorKind) -> DecodeError
Source§impl From<UperDecodeErrorKind> for DecodeError
impl From<UperDecodeErrorKind> for DecodeError
Source§fn from(error: UperDecodeErrorKind) -> DecodeError
fn from(error: UperDecodeErrorKind) -> DecodeError
Source§impl From<XerDecodeErrorKind> for DecodeError
impl From<XerDecodeErrorKind> for DecodeError
Source§fn from(error: XerDecodeErrorKind) -> DecodeError
fn from(error: XerDecodeErrorKind) -> DecodeError
Auto Trait Implementations§
impl Freeze for DecodeError
impl RefUnwindSafe for DecodeError
impl Send for DecodeError
impl Sync for DecodeError
impl Unpin for DecodeError
impl UnsafeUnpin 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.