proc_macro_assertions/raw_assert/
iter.rs

1use std::marker::PhantomData;
2
3use sealed::sealed;
4
5use crate::{ident_generator::IdentGenerator, store::Store};
6
7use super::r#trait::RawAssertable;
8
9/// Some collection of multiple asserts. One way to turn multiple [`RawAssertable`] types into one.
10pub struct AssertCollection<'a, T>(T, PhantomData<&'a ()>)
11where
12    T: IntoIterator,
13    T::Item: RawAssertable<'a>;
14
15impl<'a, T> From<T> for AssertCollection<'a, T>
16where
17    T: IntoIterator,
18    T::Item: RawAssertable<'a>,
19{
20    fn from(value: T) -> Self {
21        Self(value, PhantomData)
22    }
23}
24
25macro_rules! tuple_impl {
26    ($i:ident | $n:tt) => {};
27    (hidden $i:ident | $n:tt) => {};
28    (hidden $i:ident : $($r:ident) :+ | $n:tt: $($m:tt):+) => {
29        #[doc(hidden)]
30        #[sealed]
31        impl<'a,$i,$($r),+> super::r#trait::RawAssertable<'a> for ($i,$($r),+) where
32        $i: RawAssertable<'a>,
33        $($r: RawAssertable<'a>),+
34        {
35            fn do_raw_assert<I>(self,store: &mut Store<'a,I>)
36            where
37                I: IdentGenerator,
38            {
39                self.$n.do_raw_assert(store);
40                $(self.$m.do_raw_assert(store);)*
41
42            }
43        }
44      tuple_impl!(hidden $($r):+ | $($m):+);
45    };
46    ($i:ident : $($r:ident) :+ | $n:tt: $($m:tt):+) => {
47        #[sealed]
48        /// Also implemented for any tuple that is smaller.
49        impl<'a,$i,$($r),+> super::r#trait::RawAssertable<'a> for ($i,$($r),+) where
50        $i: RawAssertable<'a>,
51        $($r: RawAssertable<'a>),+
52        {
53            fn do_raw_assert<I>(self,store: &mut Store<'a,I>)
54            where
55                I: IdentGenerator,
56            {
57                self.$n.do_raw_assert(store);
58                $(self.$m.do_raw_assert(store);)*
59
60            }
61        }
62      tuple_impl!(hidden $($r):+ | $($m):+);
63    };
64}
65
66tuple_impl!(
67    T0:
68    T1:
69    T2:
70    T3:
71    T4:
72    T5:
73    T6:
74    T7:
75    T8:
76    T9:
77    T10:
78    T11:
79    T12:
80    T13:
81    T14:
82    T15:
83    T16:
84    T17:
85    T18:
86    T19:
87    T20:
88    T21:
89    T22:
90    T23:
91    T24:
92    T25:
93    T26:
94    T27:
95    T28:
96    T29:
97    T30:
98    T31 |
99    31:
100    30:
101    29:
102    28:
103    27:
104    26:
105    25:
106    24:
107    23:
108    22:
109    21:
110    20:
111    19:
112    18:
113    17:
114    16:
115    15:
116    14:
117    13:
118    12:
119    11:
120    10:
121    9:
122    8:
123    7:
124    6:
125    5:
126    4:
127    3:
128    2:
129    1:
130    0
131);
132
133#[sealed]
134impl<'a, T> super::r#trait::RawAssertable<'a> for AssertCollection<'a, T>
135where
136    T: IntoIterator,
137    T::Item: RawAssertable<'a>,
138{
139    fn do_raw_assert<I>(self, store: &mut Store<'a, I>)
140    where
141        I: IdentGenerator,
142    {
143        for assertable in self.0 {
144            assertable.do_raw_assert(store);
145        }
146    }
147}
148
149#[sealed]
150impl<'a, T> super::r#trait::RawAssertable<'a> for Option<T>
151where
152    T: RawAssertable<'a>,
153{
154    fn do_raw_assert<I>(self, store: &mut Store<'a, I>)
155    where
156        I: IdentGenerator,
157    {
158        if let Some(assertable) = self {
159            assertable.do_raw_assert(store);
160        }
161    }
162}