logo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//! Sequence iterator.

use crate::{Decodable, Decoder, Result};
use core::marker::PhantomData;

/// ASN.1 `SEQUENCE` iterator for [`Sequence`][`super::Sequence`] containing
/// homogeneously typed values.
pub struct SequenceIter<'a, T>
where
    T: Decodable<'a>,
{
    /// Sequence decoder
    decoder: Decoder<'a>,

    /// Type being decoded
    decodable: PhantomData<T>,
}

impl<'a, T> SequenceIter<'a, T>
where
    T: Decodable<'a>,
{
    /// Create a new sequence iterator for the given type.
    pub(super) fn new(decoder: Decoder<'a>) -> Self {
        Self {
            decoder,
            decodable: PhantomData,
        }
    }
}

impl<'a, T> Iterator for SequenceIter<'a, T>
where
    T: Decodable<'a>,
{
    type Item = Result<T>;

    fn next(&mut self) -> Option<Result<T>> {
        if self.decoder.is_finished() {
            None
        } else {
            Some(T::decode(&mut self.decoder))
        }
    }
}