Struct AnyIterator

Source
pub struct AnyIterator<'a, Mode>
where Mode: ASN1Mode,
{ /* private fields */ }
Expand description

Iterator for constructed sub-objects contained in an ANY object

In ASN.1, this is supposed to happen only for constructed objects, but this iterator does not test if Self is constructed.

Each call to .next() returns one of the following:

  • Some(Ok((input, obj))) if an object was parsed.
    obj is the next sub-object, and has type Any.
    input is the span of the sub-object.
    Unless caller wants information of current offset, input can be ignored
  • Some(Err(e)) if an error occurred.
    Note: If e is Incomplete, this means an object has as start but is missing bytes
  • None: no more objects

Note: to avoid infinite loops, calling .next() after an error happened will return None (ending iteration).

Implementations§

Source§

impl<'a, Mode> AnyIterator<'a, Mode>
where Mode: ASN1Mode,

Source

pub fn new(input: Input<'a>) -> Self

Source§

impl<'a> AnyIterator<'a, BerMode>

Source

pub fn try_collect<B>(&mut self) -> IResult<Input<'a>, B, BerError<Input<'a>>>
where B: FromIterator<Any<'a>>,

Iterate on sub-objects, returning a collection B of elements with type Any

This is a simplifier (and faster) version of AnyIterator::try_parse_collect when T = Any.

Source

pub fn try_parse_collect<B, T>( &mut self, ) -> IResult<Input<'a>, B, <T as BerParser<'a>>::Error>
where B: FromIterator<T>, T: BerParser<'a>, <T as BerParser<'a>>::Error: From<BerError<Input<'a>>>,

Try to iterate on sub-objects, returning a collection B of elements with type T

Similarly to Iterator::collect, this function requires type annotations.

Since it also has to infer the error type, it is often not possible to use the ? operator directly: .try_parse_collect()?will cause an error because it cannot infer result type. To avoid this, use an itermediate value to store result (or use the turbofish ::<> operator).

§Examples
use asn1_rs::{AnyIterator, BerMode, Input};
use hex_literal::hex;

let input = Input::from_slice(&hex!("0203010001 0203010001"));
let mut iter = AnyIterator::<BerMode>::new(input);

let r: Result<(Input, Vec<u32>), _> = iter.try_parse_collect();
let _ = r.expect("parsing failed");

let r = iter.try_parse_collect::<Vec<u32>, _>();
let _ = r.expect("parsing failed");
Source§

impl<'a> AnyIterator<'a, DerMode>

Source

pub fn try_collect<B>(&mut self) -> IResult<Input<'a>, B, BerError<Input<'a>>>
where B: FromIterator<Any<'a>>,

Iterate on sub-objects, returning a collection B of elements with type Any

This is a simplifier (and faster) version of AnyIterator::try_parse_collect when T = Any.

Source

pub fn try_parse_collect<B, T>( &mut self, ) -> IResult<Input<'a>, B, <T as DerParser<'a>>::Error>
where B: FromIterator<T>, T: DerParser<'a>, <T as DerParser<'a>>::Error: From<BerError<Input<'a>>>,

Try to iterate on sub-objects, returning a collection B of elements with type T

Similarly to Iterator::collect, this function requires type annotations.

Since it also has to infer the error type, it is often not possible to use the ? operator directly: .try_parse_collect()?will cause an error because it cannot infer result type. To avoid this, use an itermediate value to store result (or use the turbofish ::<> operator).

§Examples
use asn1_rs::{AnyIterator, DerMode, Input};
use hex_literal::hex;

let input = Input::from_slice(&hex!("0203010001 0203010001"));
let mut iter = AnyIterator::<DerMode>::new(input);

let r: Result<(Input, Vec<u32>), _> = iter.try_parse_collect();
let _ = r.expect("parsing failed");

let r = iter.try_parse_collect::<Vec<u32>, _>();
let _ = r.expect("parsing failed");

Trait Implementations§

Source§

impl<'a, Mode> Debug for AnyIterator<'a, Mode>
where Mode: ASN1Mode + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<'a, Mode> Freeze for AnyIterator<'a, Mode>

§

impl<'a, Mode> RefUnwindSafe for AnyIterator<'a, Mode>
where Mode: RefUnwindSafe,

§

impl<'a, Mode> !Send for AnyIterator<'a, Mode>

§

impl<'a, Mode> !Sync for AnyIterator<'a, Mode>

§

impl<'a, Mode> Unpin for AnyIterator<'a, Mode>

§

impl<'a, Mode> UnwindSafe for AnyIterator<'a, Mode>
where Mode: RefUnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

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,

Causes self to use its Display implementation when Debug-formatted.
Source§

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,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

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,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

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,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<I> IntoIterator for I
where I: Iterator,

Source§

type Item = <I as Iterator>::Item

The type of the elements being iterated over.
Source§

type IntoIter = I

Which kind of iterator are we turning this into?
Source§

fn into_iter(self) -> I

Creates an iterator from a value. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where 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) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

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

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
where Self: Borrow<B>, B: ?Sized,

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
where Self: BorrowMut<B>, B: ?Sized,

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
where Self: AsRef<R>, R: ?Sized,

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
where Self: AsMut<R>, R: ?Sized,

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
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.