use std::marker::PhantomData;
use sealed::sealed;
use crate::{ident_generator::IdentGenerator, store::Store};
use super::r#trait::RawAssertable;
struct AssertCollection<'a, T>(T, PhantomData<&'a ()>)
where
T: IntoIterator,
T::Item: RawAssertable<'a>;
impl<'a, T> From<T> for AssertCollection<'a, T>
where
T: IntoIterator,
T::Item: RawAssertable<'a>,
{
fn from(value: T) -> Self {
Self(value, PhantomData)
}
}
macro_rules! tupel_impl {
($i:ident | $n:tt) => {};
(hidden $i:ident : $($r:ident) :+ | $n:tt: $($m:tt):+) => {
#[doc(hidden)]
#[sealed]
impl<'a,$i,$($r),+> super::r#trait::RawAssertable<'a> for ($i,$($r),+) where
$i: RawAssertable<'a>,
$($r: RawAssertable<'a>),+
{
fn do_raw_assert<I>(self,store: &mut Store<'a,I>)
where
I: IdentGenerator,
{
self.$n.do_raw_assert(store);
$(self.$m.do_raw_assert(store);)*
}
}
};
($i:ident : $($r:ident) :+ | $n:tt: $($m:tt):+) => {
#[sealed]
impl<'a,$i,$($r),+> super::r#trait::RawAssertable<'a> for ($i,$($r),+) where
$i: RawAssertable<'a>,
$($r: RawAssertable<'a>),+
{
fn do_raw_assert<I>(self,store: &mut Store<'a,I>)
where
I: IdentGenerator,
{
self.$n.do_raw_assert(store);
$(self.$m.do_raw_assert(store);)*
}
}
tupel_impl!(hidden $($r):+ | $($m):+);
};
}
tupel_impl!(
T0:
T1:
T2:
T3:
T4:
T5:
T6:
T7:
T8:
T9:
T10:
T11:
T12:
T13:
T14:
T15:
T16:
T17:
T18:
T19:
T20:
T21:
T22:
T23:
T24:
T25:
T26:
T27:
T28:
T29:
T30:
T31 |
31:
30:
29:
28:
27:
26:
25:
24:
23:
22:
21:
20:
19:
18:
17:
16:
15:
14:
13:
12:
11:
10:
9:
8:
7:
6:
5:
4:
3:
2:
1:
0
);
#[sealed]
impl<'a, T> super::r#trait::RawAssertable<'a> for AssertCollection<'a, T>
where
T: IntoIterator,
T::Item: RawAssertable<'a>,
{
fn do_raw_assert<I>(self, store: &mut Store<'a, I>)
where
I: IdentGenerator,
{
for assertable in self.0.into_iter() {
assertable.do_raw_assert(store);
}
}
}