scooby/tools/
into_non_zero_array.rs

1pub trait IntoNonZeroArray<T, const N: usize> {
2    fn into_non_zero_array(self) -> [T; N];
3}
4
5// Strings
6
7impl IntoNonZeroArray<String, 1> for String {
8    fn into_non_zero_array(self) -> [String; 1] {
9        [self]
10    }
11}
12
13impl IntoNonZeroArray<String, 1> for &str {
14    fn into_non_zero_array(self) -> [String; 1] {
15        [self.to_owned()]
16    }
17}
18
19// Generic arrays
20
21impl<T, const N: usize> IntoNonZeroArray<T, N> for [T; N] {
22    fn into_non_zero_array(self) -> [T; N] {
23        if N == 0 {
24            panic!("Should not be creating 0-sized arrays");
25        }
26
27        self
28    }
29}
30
31// Generic tuples
32
33impl<T, U> IntoNonZeroArray<T, 1> for (U,)
34where
35    U: Into<T>,
36{
37    fn into_non_zero_array(self) -> [T; 1] {
38        [self.0.into()]
39    }
40}
41
42impl<T, U1, U2> IntoNonZeroArray<T, 2> for (U1, U2)
43where
44    U1: Into<T>,
45    U2: Into<T>,
46{
47    fn into_non_zero_array(self) -> [T; 2] {
48        [self.0.into(), self.1.into()]
49    }
50}
51
52impl<T, U1, U2, U3> IntoNonZeroArray<T, 3> for (U1, U2, U3)
53where
54    U1: Into<T>,
55    U2: Into<T>,
56    U3: Into<T>,
57{
58    fn into_non_zero_array(self) -> [T; 3] {
59        [self.0.into(), self.1.into(), self.2.into()]
60    }
61}
62
63impl<T, U1, U2, U3, U4> IntoNonZeroArray<T, 4> for (U1, U2, U3, U4)
64where
65    U1: Into<T>,
66    U2: Into<T>,
67    U3: Into<T>,
68    U4: Into<T>,
69{
70    fn into_non_zero_array(self) -> [T; 4] {
71        [self.0.into(), self.1.into(), self.2.into(), self.3.into()]
72    }
73}
74
75impl<T, U1, U2, U3, U4, U5> IntoNonZeroArray<T, 5> for (U1, U2, U3, U4, U5)
76where
77    U1: Into<T>,
78    U2: Into<T>,
79    U3: Into<T>,
80    U4: Into<T>,
81    U5: Into<T>,
82{
83    fn into_non_zero_array(self) -> [T; 5] {
84        [
85            self.0.into(),
86            self.1.into(),
87            self.2.into(),
88            self.3.into(),
89            self.4.into(),
90        ]
91    }
92}
93
94impl<T, U1, U2, U3, U4, U5, U6> IntoNonZeroArray<T, 6> for (U1, U2, U3, U4, U5, U6)
95where
96    U1: Into<T>,
97    U2: Into<T>,
98    U3: Into<T>,
99    U4: Into<T>,
100    U5: Into<T>,
101    U6: Into<T>,
102{
103    fn into_non_zero_array(self) -> [T; 6] {
104        [
105            self.0.into(),
106            self.1.into(),
107            self.2.into(),
108            self.3.into(),
109            self.4.into(),
110            self.5.into(),
111        ]
112    }
113}
114
115impl<T, U1, U2, U3, U4, U5, U6, U7> IntoNonZeroArray<T, 7> for (U1, U2, U3, U4, U5, U6, U7)
116where
117    U1: Into<T>,
118    U2: Into<T>,
119    U3: Into<T>,
120    U4: Into<T>,
121    U5: Into<T>,
122    U6: Into<T>,
123    U7: Into<T>,
124{
125    fn into_non_zero_array(self) -> [T; 7] {
126        [
127            self.0.into(),
128            self.1.into(),
129            self.2.into(),
130            self.3.into(),
131            self.4.into(),
132            self.5.into(),
133            self.6.into(),
134        ]
135    }
136}
137
138impl<T, U1, U2, U3, U4, U5, U6, U7, U8> IntoNonZeroArray<T, 8> for (U1, U2, U3, U4, U5, U6, U7, U8)
139where
140    U1: Into<T>,
141    U2: Into<T>,
142    U3: Into<T>,
143    U4: Into<T>,
144    U5: Into<T>,
145    U6: Into<T>,
146    U7: Into<T>,
147    U8: Into<T>,
148{
149    fn into_non_zero_array(self) -> [T; 8] {
150        [
151            self.0.into(),
152            self.1.into(),
153            self.2.into(),
154            self.3.into(),
155            self.4.into(),
156            self.5.into(),
157            self.6.into(),
158            self.7.into(),
159        ]
160    }
161}
162
163impl<T, U1, U2, U3, U4, U5, U6, U7, U8, U9> IntoNonZeroArray<T, 9>
164    for (U1, U2, U3, U4, U5, U6, U7, U8, U9)
165where
166    U1: Into<T>,
167    U2: Into<T>,
168    U3: Into<T>,
169    U4: Into<T>,
170    U5: Into<T>,
171    U6: Into<T>,
172    U7: Into<T>,
173    U8: Into<T>,
174    U9: Into<T>,
175{
176    fn into_non_zero_array(self) -> [T; 9] {
177        [
178            self.0.into(),
179            self.1.into(),
180            self.2.into(),
181            self.3.into(),
182            self.4.into(),
183            self.5.into(),
184            self.6.into(),
185            self.7.into(),
186            self.8.into(),
187        ]
188    }
189}
190
191impl<T, U1, U2, U3, U4, U5, U6, U7, U8, U9, U10> IntoNonZeroArray<T, 10>
192    for (U1, U2, U3, U4, U5, U6, U7, U8, U9, U10)
193where
194    U1: Into<T>,
195    U2: Into<T>,
196    U3: Into<T>,
197    U4: Into<T>,
198    U5: Into<T>,
199    U6: Into<T>,
200    U7: Into<T>,
201    U8: Into<T>,
202    U9: Into<T>,
203    U10: Into<T>,
204{
205    fn into_non_zero_array(self) -> [T; 10] {
206        [
207            self.0.into(),
208            self.1.into(),
209            self.2.into(),
210            self.3.into(),
211            self.4.into(),
212            self.5.into(),
213            self.6.into(),
214            self.7.into(),
215            self.8.into(),
216            self.9.into(),
217        ]
218    }
219}
220
221impl<T, U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11> IntoNonZeroArray<T, 11>
222    for (U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11)
223where
224    U1: Into<T>,
225    U2: Into<T>,
226    U3: Into<T>,
227    U4: Into<T>,
228    U5: Into<T>,
229    U6: Into<T>,
230    U7: Into<T>,
231    U8: Into<T>,
232    U9: Into<T>,
233    U10: Into<T>,
234    U11: Into<T>,
235{
236    fn into_non_zero_array(self) -> [T; 11] {
237        [
238            self.0.into(),
239            self.1.into(),
240            self.2.into(),
241            self.3.into(),
242            self.4.into(),
243            self.5.into(),
244            self.6.into(),
245            self.7.into(),
246            self.8.into(),
247            self.9.into(),
248            self.10.into(),
249        ]
250    }
251}
252
253impl<T, U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12> IntoNonZeroArray<T, 12>
254    for (U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12)
255where
256    U1: Into<T>,
257    U2: Into<T>,
258    U3: Into<T>,
259    U4: Into<T>,
260    U5: Into<T>,
261    U6: Into<T>,
262    U7: Into<T>,
263    U8: Into<T>,
264    U9: Into<T>,
265    U10: Into<T>,
266    U11: Into<T>,
267    U12: Into<T>,
268{
269    fn into_non_zero_array(self) -> [T; 12] {
270        [
271            self.0.into(),
272            self.1.into(),
273            self.2.into(),
274            self.3.into(),
275            self.4.into(),
276            self.5.into(),
277            self.6.into(),
278            self.7.into(),
279            self.8.into(),
280            self.9.into(),
281            self.10.into(),
282            self.11.into(),
283        ]
284    }
285}