use crate::Validate;
#[cfg(feature = "async")]
use crate::Resolve;
#[cfg_attr(
feature = "async",
doc = "\nWith the `async` feature, also covers items implementing [Resolve](crate::Resolve)."
)]
#[cfg_attr(feature = "async", allow(async_fn_in_trait))]
pub trait IteratorExt: IntoIterator {
fn validate_all_in_context<I>(
self,
ctx: &<Self::Item as Validate>::Context,
) -> Result<I, <Self::Item as Validate>::Error>
where
Self::Item: Validate,
I: Extend<<Self::Item as Validate>::Output> + Default;
fn validate_all<I>(self) -> Result<I, <Self::Item as Validate>::Error>
where
Self::Item: Validate,
<Self::Item as Validate>::Context: From<()>,
I: Extend<<Self::Item as Validate>::Output> + Default;
fn partition_validated_in_context<I1, I2>(
self,
ctx: &<Self::Item as Validate>::Context,
) -> (I1, I2)
where
Self::Item: Validate,
I1: Extend<<Self::Item as Validate>::Output> + Default,
I2: Extend<<Self::Item as Validate>::Error> + Default;
fn partition_validated<I1, I2>(self) -> (I1, I2)
where
Self::Item: Validate,
<Self::Item as Validate>::Context: From<()>,
I1: Extend<<Self::Item as Validate>::Output> + Default,
I2: Extend<<Self::Item as Validate>::Error> + Default;
#[cfg(feature = "async")]
async fn resolve_all_in_context<I>(
self,
ctx: &<Self::Item as Resolve>::Context,
) -> Result<I, <Self::Item as Resolve>::Error>
where
Self: Sized,
Self::Item: Resolve,
I: Extend<<Self::Item as Resolve>::Output> + Default;
#[cfg(feature = "async")]
async fn resolve_all<I>(self) -> Result<I, <Self::Item as Resolve>::Error>
where
Self: Sized,
Self::Item: Resolve,
<Self::Item as Resolve>::Context: From<()>,
I: Extend<<Self::Item as Resolve>::Output> + Default;
#[cfg(feature = "async")]
async fn partition_resolved_in_context<I1, I2>(
self,
ctx: &<Self::Item as Resolve>::Context,
) -> (I1, I2)
where
Self: Sized,
Self::Item: Resolve,
I1: Extend<<Self::Item as Resolve>::Output> + Default,
I2: Extend<<Self::Item as Resolve>::Error> + Default;
#[cfg(feature = "async")]
async fn partition_resolved<I1, I2>(self) -> (I1, I2)
where
Self: Sized,
Self::Item: Resolve,
<Self::Item as Resolve>::Context: From<()>,
I1: Extend<<Self::Item as Resolve>::Output> + Default,
I2: Extend<<Self::Item as Resolve>::Error> + Default;
}
impl<Iter: IntoIterator> IteratorExt for Iter {
fn validate_all_in_context<I>(
self,
ctx: &<Self::Item as Validate>::Context,
) -> Result<I, <Self::Item as Validate>::Error>
where
Self::Item: Validate,
I: Extend<<Self::Item as Validate>::Output> + Default,
{
let mut out = I::default();
for item in self {
out.extend(Some(item.validate_in_context(ctx)?));
}
Ok(out)
}
fn validate_all<I>(self) -> Result<I, <Self::Item as Validate>::Error>
where
Self::Item: Validate,
<Self::Item as Validate>::Context: From<()>,
I: Extend<<Self::Item as Validate>::Output> + Default,
{
self.validate_all_in_context(&().into())
}
fn partition_validated_in_context<I1, I2>(
self,
ctx: &<Self::Item as Validate>::Context,
) -> (I1, I2)
where
Self::Item: Validate,
I1: Extend<<Self::Item as Validate>::Output> + Default,
I2: Extend<<Self::Item as Validate>::Error> + Default,
{
let mut oks = I1::default();
let mut errs = I2::default();
for item in self {
match item.validate_in_context(ctx) {
Ok(v) => oks.extend(Some(v)),
Err(e) => errs.extend(Some(e)),
}
}
(oks, errs)
}
fn partition_validated<I1, I2>(self) -> (I1, I2)
where
Self::Item: Validate,
<Self::Item as Validate>::Context: From<()>,
I1: Extend<<Self::Item as Validate>::Output> + Default,
I2: Extend<<Self::Item as Validate>::Error> + Default,
{
self.partition_validated_in_context(&().into())
}
#[cfg(feature = "async")]
async fn resolve_all_in_context<I>(
self,
ctx: &<Self::Item as Resolve>::Context,
) -> Result<I, <Self::Item as Resolve>::Error>
where
Self: Sized,
Self::Item: Resolve,
I: Extend<<Self::Item as Resolve>::Output> + Default,
{
let mut out = I::default();
for item in self {
out.extend(Some(item.resolve_in_context(ctx).await?));
}
Ok(out)
}
#[cfg(feature = "async")]
async fn resolve_all<I>(self) -> Result<I, <Self::Item as Resolve>::Error>
where
Self: Sized,
Self::Item: Resolve,
<Self::Item as Resolve>::Context: From<()>,
I: Extend<<Self::Item as Resolve>::Output> + Default,
{
self.resolve_all_in_context(&().into()).await
}
#[cfg(feature = "async")]
async fn partition_resolved_in_context<I1, I2>(
self,
ctx: &<Self::Item as Resolve>::Context,
) -> (I1, I2)
where
Self: Sized,
Self::Item: Resolve,
I1: Extend<<Self::Item as Resolve>::Output> + Default,
I2: Extend<<Self::Item as Resolve>::Error> + Default,
{
let mut oks = I1::default();
let mut errs = I2::default();
for item in self {
match item.resolve_in_context(ctx).await {
Ok(v) => oks.extend(Some(v)),
Err(e) => errs.extend(Some(e)),
}
}
(oks, errs)
}
#[cfg(feature = "async")]
async fn partition_resolved<I1, I2>(self) -> (I1, I2)
where
Self: Sized,
Self::Item: Resolve,
<Self::Item as Resolve>::Context: From<()>,
I1: Extend<<Self::Item as Resolve>::Output> + Default,
I2: Extend<<Self::Item as Resolve>::Error> + Default,
{
self.partition_resolved_in_context(&().into()).await
}
}