proc_macro_assertions/raw_assert/
iter.rs1use std::marker::PhantomData;
2
3use sealed::sealed;
4
5use crate::{ident_generator::IdentGenerator, store::Store};
6
7use super::r#trait::RawAssertable;
8
9pub 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 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}