use super::common::{self, DecodeProperty};
use crate::Tag;
use core::{iter::FusedIterator, marker::PhantomData};
use der::{Reader, SliceReader};
#[derive(Clone, Debug)]
pub struct DictIter<'a, V> {
reader: SliceReader<'a>,
_marker: PhantomData<V>,
}
impl<'a, V> DictIter<'a, V> {
pub(crate) fn new(reader: SliceReader<'a>) -> Self {
Self {
reader,
_marker: Default::default(),
}
}
}
impl<'a, V: DecodeProperty<'a> + 'a> Iterator for DictIter<'a, V> {
type Item = der::Result<(Tag, V)>;
fn next(&mut self) -> Option<Self::Item> {
if !self.reader.is_finished() {
Some(common::decode_property(&mut self.reader))
} else {
None
}
}
}
impl<'a, V: DecodeProperty<'a> + 'a> FusedIterator for DictIter<'a, V> {}
#[derive(Clone, Debug)]
pub struct ArrayIter<'a, V> {
reader: SliceReader<'a>,
_marker: PhantomData<V>,
}
impl<'a, V> ArrayIter<'a, V> {
pub(crate) fn new(reader: SliceReader<'a>) -> Self {
Self {
reader,
_marker: Default::default(),
}
}
}
impl<'a, V: DecodeProperty<'a> + 'a> Iterator for ArrayIter<'a, V> {
type Item = der::Result<V>;
fn next(&mut self) -> Option<Self::Item> {
if !self.reader.is_finished() {
Some(V::decode(&mut self.reader))
} else {
None
}
}
}
impl<'a, V: DecodeProperty<'a> + 'a> FusedIterator for ArrayIter<'a, V> {}