use std::marker::PhantomData;
use fallible_streaming_iterator::FallibleStreamingIterator;
use super::{DbnMetadata, DecodeStream};
use crate::{Error, HasRType, Result};
pub struct StreamIterDecoder<D, T> {
decoder: D,
i: Option<usize>,
_marker: PhantomData<T>,
}
impl<D, T> StreamIterDecoder<D, T>
where
T: HasRType,
{
pub fn new(decoder: D) -> Self {
Self {
decoder,
i: Some(0),
_marker: PhantomData,
}
}
pub fn get_ref(&self) -> &D {
&self.decoder
}
}
impl<D, T> FallibleStreamingIterator for StreamIterDecoder<D, T>
where
D: DecodeStream,
T: HasRType,
{
type Error = Error;
type Item = T;
fn advance(&mut self) -> Result<()> {
if let Some(i) = self.i.as_mut() {
match self.decoder.decode_record::<T>() {
Ok(Some(_)) => {
*i += 1;
Ok(())
}
Ok(None) => {
self.i = None;
Ok(())
}
Err(err) => {
self.i = None;
Err(err)
}
}
} else {
Ok(())
}
}
fn get(&self) -> Option<&Self::Item> {
if self.i.is_some() {
self.decoder
.last_record()
.map(|r| unsafe { r.get_unchecked() })
} else {
None
}
}
}
impl<D, T> DbnMetadata for StreamIterDecoder<D, T>
where
D: DbnMetadata,
{
fn metadata(&self) -> &crate::Metadata {
self.decoder.metadata()
}
fn metadata_mut(&mut self) -> &mut crate::Metadata {
self.decoder.metadata_mut()
}
}