use serde::de;
use crate::errors::*;
use super::read::DeRead;
use super::reentrant::ReentrantGuard;
use super::Deserializer;
pub struct SeqAccess<'a, R> {
de: &'a mut Deserializer<R>,
remaining: usize,
}
impl<'a, 'de, R> SeqAccess<'a, R>
where
R: 'a + DeRead<'de>,
{
pub fn new(de: &'a mut Deserializer<R>, nitems: usize, _guard: &ReentrantGuard) -> Self {
SeqAccess {
de,
remaining: nitems,
}
}
}
impl<'a, 'de, R> de::SeqAccess<'de> for SeqAccess<'a, R>
where
R: 'a + DeRead<'de>,
{
type Error = Error;
fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
where
T: de::DeserializeSeed<'de>,
{
if self.remaining == 0 {
Ok(None)
} else {
self.remaining -= 1;
let value = seed.deserialize(&mut *self.de)?;
Ok(Some(value))
}
}
}