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::Codec;
use rasn::error::DecodeErrorKind;
use rasn::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>
§codec: Codec
Implementations§
Source§impl DecodeError
impl DecodeError
pub fn alphabet_constraint_not_satisfied( reason: PermittedAlphabetError, codec: Codec, ) -> Self
pub fn size_constraint_not_satisfied( size: Option<usize>, expected: String, codec: Codec, ) -> Self
pub fn value_constraint_not_satisfied( value: Integer, expected: Bounded<i128>, codec: Codec, ) -> Self
pub fn discriminant_value_not_found(discriminant: isize, codec: Codec) -> Self
pub fn range_exceeds_platform_width( needed: u32, present: u32, codec: Codec, ) -> Self
pub fn fixed_string_conversion_failed( tag: Tag, actual: usize, expected: usize, codec: Codec, ) -> Self
pub fn incorrect_item_number_in_sequence( expected: usize, actual: usize, codec: Codec, ) -> Self
pub fn integer_overflow(max_width: u32, codec: Codec) -> Self
pub fn integer_type_conversion_failed(msg: String, codec: Codec) -> Self
pub fn invalid_bit_string(bits: u8, codec: Codec) -> Self
pub fn missing_tag_class_or_value_in_sequence_or_set( class: Class, value: u32, codec: Codec, ) -> Self
pub fn type_not_extensible(codec: Codec) -> Self
pub fn parser_fail(msg: String, codec: Codec) -> Self
pub fn required_extension_not_present(tag: Tag, codec: Codec) -> Self
pub fn extension_present_but_not_required(tag: Tag, codec: Codec) -> Self
pub fn enumeration_index_not_found( index: usize, extended_list: bool, codec: Codec, ) -> Self
pub fn choice_index_exceeds_platform_width( needed: u32, present: u64, codec: Codec, ) -> Self
pub fn length_exceeds_platform_width(msg: String, codec: Codec) -> Self
pub fn choice_index_not_found( index: usize, variants: Variants, codec: Codec, ) -> Self
pub fn string_conversion_failed(tag: Tag, msg: String, codec: Codec) -> Self
pub fn unexpected_extra_data(length: usize, codec: Codec) -> Self
pub fn unexpected_empty_input(codec: Codec) -> Self
pub fn assert_length( expected: usize, actual: usize, codec: Codec, ) -> Result<(), DecodeError>
pub fn map_nom_err<T: Debug>(error: Err<Error<T>>, codec: Codec) -> DecodeError
pub fn from_kind(kind: DecodeErrorKind, codec: Codec) -> Self
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
Source§fn custom<D: Display>(msg: D, codec: Codec) -> Self
fn custom<D: Display>(msg: D, codec: Codec) -> Self
Creates a new general error using
msg
when decoding ASN.1.Source§fn incomplete(needed: Needed, codec: Codec) -> Self
fn incomplete(needed: Needed, codec: Codec) -> Self
Creates a new error about needing more data to finish parsing.
Source§fn exceeds_max_length(length: BigUint, codec: Codec) -> Self
fn exceeds_max_length(length: BigUint, codec: Codec) -> Self
Creates a new error about exceeding the maximum allowed data for a type.
Source§fn missing_field(name: &'static str, codec: Codec) -> Self
fn missing_field(name: &'static str, codec: Codec) -> Self
Creates a new error about a missing field.
Source§fn no_valid_choice(name: &'static str, codec: Codec) -> Self
fn no_valid_choice(name: &'static str, codec: Codec) -> Self
Creates a new error about being unable to match any variant in a choice.
Source§fn field_error(name: &'static str, nested: DecodeError, codec: Codec) -> Self
fn field_error(name: &'static str, nested: DecodeError, codec: Codec) -> Self
Creates a new error about being unable to decode a field in a compound
type, such as a set or sequence.
Source§fn duplicate_field(name: &'static str, codec: Codec) -> Self
fn duplicate_field(name: &'static str, codec: Codec) -> Self
Creates a new error about finding a duplicate field.
Source§impl From<BerDecodeErrorKind> for DecodeError
impl From<BerDecodeErrorKind> for DecodeError
Source§fn from(error: BerDecodeErrorKind) -> Self
fn from(error: BerDecodeErrorKind) -> Self
Converts to this type from the input type.
Source§impl From<CodecDecodeError> for DecodeError
impl From<CodecDecodeError> for DecodeError
Source§fn from(error: CodecDecodeError) -> Self
fn from(error: CodecDecodeError) -> Self
Converts to this type from the input type.
Source§impl From<CoerDecodeErrorKind> for DecodeError
impl From<CoerDecodeErrorKind> for DecodeError
Source§fn from(error: CoerDecodeErrorKind) -> Self
fn from(error: CoerDecodeErrorKind) -> Self
Converts to this type from the input type.
Source§impl From<DerDecodeErrorKind> for DecodeError
impl From<DerDecodeErrorKind> for DecodeError
Source§fn from(error: DerDecodeErrorKind) -> Self
fn from(error: DerDecodeErrorKind) -> Self
Converts to this type from the input type.
Source§impl From<JerDecodeErrorKind> for DecodeError
impl From<JerDecodeErrorKind> for DecodeError
Source§fn from(error: JerDecodeErrorKind) -> Self
fn from(error: JerDecodeErrorKind) -> Self
Converts to this type from the input type.
Source§impl From<OerDecodeErrorKind> for DecodeError
impl From<OerDecodeErrorKind> for DecodeError
Source§fn from(error: OerDecodeErrorKind) -> Self
fn from(error: OerDecodeErrorKind) -> Self
Converts to this type from the input type.
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> 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
Mutably borrows from an owned value. Read more
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
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,
Causes
self
to use its UpperHex
implementation when
Debug
-formatted.Source§impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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>
Converts
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>
Converts
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,
Pipes by value. This is generally the method you want to use. Read more
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,
Borrows
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,
Mutably borrows
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
Borrows
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
Mutably borrows
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
Borrows
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Immutable access to the
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
Mutable access to the
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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.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
Calls
.tap_deref()
only in debug builds, and is erased in release
builds.