serde_taml 0.0.3

Serde-integration for TAML, a kind-to-humans configuration language
Documentation
use super::{Deserializer, Error, ReportFor, Result};
use serde::de;
use taml::{diagnostics::Reporter as diagReporter, parsing::Taml, Position};
use tap::Pipe;

#[allow(clippy::type_complexity)]
pub struct ListAccess<'a, 'de, P: Position, Reporter: diagReporter<P>> {
	deserializer: Deserializer<'a, 'de, P, Reporter>,
	entries: Box<dyn 'a + Iterator<Item = &'a Taml<'de, P>>>,
}
impl<'a, 'de, P: Position, Reporter: diagReporter<P>> ListAccess<'a, 'de, P, Reporter> {
	pub fn new(deserializer: Deserializer<'a, 'de, P, Reporter>, list: &'a [Taml<'de, P>]) -> Self {
		Self {
			deserializer,
			entries: list.iter().pipe(Box::new),
		}
	}
}

impl<'a, 'de, P: Position, Reporter: diagReporter<P>> de::SeqAccess<'de>
	for ListAccess<'a, 'de, P, Reporter>
{
	type Error = Error;

	fn next_element_seed<T>(&mut self, seed: T) -> Result<Option<T::Value>>
	where
		T: de::DeserializeSeed<'de>,
	{
		self.entries
			.next()
			.map(|e| {
				seed.deserialize(&mut Deserializer {
					data: e,
					..self.deserializer.by_ref()
				})
			})
			.transpose()
			.report_for(&mut self.deserializer)
	}

	fn size_hint(&self) -> Option<usize> {
		let size = self.entries.size_hint();
		size.1.filter(|l| *l == size.0)
	}
}