use super::super::super::{
super::{annotate::*, normal::*},
errors::*,
iterator::*,
resolve::*,
};
use {kutil::std::error::*, std::vec};
pub struct ResolvingVariantIterator<InnerT, AnnotatedT>
where
InnerT: Iterator<Item = Variant<AnnotatedT>>,
{
pub inner: InnerT,
}
impl<'own, InnerT, AnnotatedT> ResolvingVariantIterator<InnerT, AnnotatedT>
where
InnerT: Iterator<Item = Variant<AnnotatedT>>,
{
pub fn new(inner: InnerT) -> Self {
Self { inner }
}
pub fn new_for<IterableT>(iterable: IterableT) -> Self
where
IterableT: IntoIterator<IntoIter = InnerT>,
{
Self::new(iterable.into_iter())
}
}
impl<'own, AnnotatedT> ResolvingVariantIterator<vec::IntoIter<Variant<AnnotatedT>>, AnnotatedT> {
pub fn new_from<ErrorReceiverT>(
variant: Variant<AnnotatedT>,
errors: &mut ErrorReceiverT,
) -> ResolveResult<Self, AnnotatedT>
where
AnnotatedT: Annotated + Clone + Default,
ErrorReceiverT: ErrorReceiver<ResolveError<AnnotatedT>>,
{
match variant {
Variant::List(list) => return Ok(Some(Self::new_for(list))),
_ => errors.give(IncompatibleVariantTypeError::new_from(&variant, &["list"]))?,
}
Ok(None)
}
}
impl<'own, ResolvedT, InnerT, AnnotatedT> ResolvingIterator<ResolvedT, AnnotatedT>
for ResolvingVariantIterator<InnerT, AnnotatedT>
where
Variant<AnnotatedT>: Resolve<ResolvedT, AnnotatedT>,
InnerT: Iterator<Item = Variant<AnnotatedT>>,
{
fn resolve_next<ErrorReceiverT>(&mut self, errors: &mut ErrorReceiverT) -> ResolveResult<ResolvedT, AnnotatedT>
where
ErrorReceiverT: ErrorReceiver<ResolveError<AnnotatedT>>,
{
Ok(match self.inner.next() {
Some(next) => next.resolve_with_errors(errors)?,
None => None,
})
}
}