1#![allow(clippy::many_single_char_names)]
2use crate::widget::Widget;
3
4pub struct OptWidgetList(pub Vec<Option<Widget>>);
7impl OptWidgetList {
8    #[must_use]
9    pub fn new() -> Self {
10        Self(vec![])
11    }
12
13    pub fn push(&mut self, widget: impl Into<Widget>) {
14        match widget.into() {
15            Widget::Empty(..) => self.0.push(None),
16            other => self.push(Some(other)),
17        }
18    }
19
20    #[must_use]
21    pub fn to_vec(self) -> Vec<Option<Widget>> {
22        self.0
23    }
24}
25
26impl Default for OptWidgetList {
27    fn default() -> Self {
28        Self::new()
29    }
30}
31
32impl From<Vec<Widget>> for OptWidgetList {
33    fn from(v: Vec<Widget>) -> Self {
34        Self(v.into_iter().map(Some).collect())
35    }
36}
37
38impl From<Vec<Option<Widget>>> for OptWidgetList {
39    fn from(v: Vec<Option<Widget>>) -> Self {
40        Self(v)
41    }
42}
43
44impl From<()> for OptWidgetList {
46    fn from((): ()) -> Self {
47        OptWidgetList(vec![])
48    }
49}
50
51impl<A: Into<Option<Widget>>> From<(A,)> for OptWidgetList {
52    fn from((a,): (A,)) -> Self {
53        OptWidgetList(vec![a.into()])
54    }
55}
56
57impl<A: Into<Option<Widget>>, B: Into<Option<Widget>>> From<(A, B)> for OptWidgetList {
58    fn from((a, b): (A, B)) -> Self {
59        OptWidgetList(vec![a.into(), b.into()])
60    }
61}
62
63impl<A: Into<Option<Widget>>, B: Into<Option<Widget>>, C: Into<Option<Widget>>> From<(A, B, C)>
64    for OptWidgetList
65{
66    fn from((a, b, c): (A, B, C)) -> Self {
67        OptWidgetList(vec![a.into(), b.into(), c.into()])
68    }
69}
70
71impl<
72        A: Into<Option<Widget>>,
73        B: Into<Option<Widget>>,
74        C: Into<Option<Widget>>,
75        D: Into<Option<Widget>>,
76    > From<(A, B, C, D)> for OptWidgetList
77{
78    fn from((a, b, c, d): (A, B, C, D)) -> Self {
79        OptWidgetList(vec![a.into(), b.into(), c.into(), d.into()])
80    }
81}
82
83impl<
84        A: Into<Option<Widget>>,
85        B: Into<Option<Widget>>,
86        C: Into<Option<Widget>>,
87        D: Into<Option<Widget>>,
88        E: Into<Option<Widget>>,
89    > From<(A, B, C, D, E)> for OptWidgetList
90{
91    fn from((a, b, c, d, e): (A, B, C, D, E)) -> Self {
92        OptWidgetList(vec![a.into(), b.into(), c.into(), d.into(), e.into()])
93    }
94}
95
96impl<
97        A: Into<Option<Widget>>,
98        B: Into<Option<Widget>>,
99        C: Into<Option<Widget>>,
100        D: Into<Option<Widget>>,
101        E: Into<Option<Widget>>,
102        F: Into<Option<Widget>>,
103    > From<(A, B, C, D, E, F)> for OptWidgetList
104{
105    fn from((a, b, c, d, e, f): (A, B, C, D, E, F)) -> Self {
106        OptWidgetList(vec![
107            a.into(),
108            b.into(),
109            c.into(),
110            d.into(),
111            e.into(),
112            f.into(),
113        ])
114    }
115}
116
117impl<
118        A: Into<Option<Widget>>,
119        B: Into<Option<Widget>>,
120        C: Into<Option<Widget>>,
121        D: Into<Option<Widget>>,
122        E: Into<Option<Widget>>,
123        F: Into<Option<Widget>>,
124        G: Into<Option<Widget>>,
125    > From<(A, B, C, D, E, F, G)> for OptWidgetList
126{
127    fn from((a, b, c, d, e, f, g): (A, B, C, D, E, F, G)) -> Self {
128        OptWidgetList(vec![
129            a.into(),
130            b.into(),
131            c.into(),
132            d.into(),
133            e.into(),
134            f.into(),
135            g.into(),
136        ])
137    }
138}
139
140impl<
141        A: Into<Option<Widget>>,
142        B: Into<Option<Widget>>,
143        C: Into<Option<Widget>>,
144        D: Into<Option<Widget>>,
145        E: Into<Option<Widget>>,
146        F: Into<Option<Widget>>,
147        G: Into<Option<Widget>>,
148        H: Into<Option<Widget>>,
149    > From<(A, B, C, D, E, F, G, H)> for OptWidgetList
150{
151    fn from((a, b, c, d, e, f, g, h): (A, B, C, D, E, F, G, H)) -> Self {
152        OptWidgetList(vec![
153            a.into(),
154            b.into(),
155            c.into(),
156            d.into(),
157            e.into(),
158            f.into(),
159            g.into(),
160            h.into(),
161        ])
162    }
163}
164
165impl<
166        A: Into<Option<Widget>>,
167        B: Into<Option<Widget>>,
168        C: Into<Option<Widget>>,
169        D: Into<Option<Widget>>,
170        E: Into<Option<Widget>>,
171        F: Into<Option<Widget>>,
172        G: Into<Option<Widget>>,
173        H: Into<Option<Widget>>,
174        I: Into<Option<Widget>>,
175    > From<(A, B, C, D, E, F, G, H, I)> for OptWidgetList
176{
177    fn from((a, b, c, d, e, f, g, h, i): (A, B, C, D, E, F, G, H, I)) -> Self {
178        OptWidgetList(vec![
179            a.into(),
180            b.into(),
181            c.into(),
182            d.into(),
183            e.into(),
184            f.into(),
185            g.into(),
186            h.into(),
187            i.into(),
188        ])
189    }
190}
191
192impl<
193        A: Into<Option<Widget>>,
194        B: Into<Option<Widget>>,
195        C: Into<Option<Widget>>,
196        D: Into<Option<Widget>>,
197        E: Into<Option<Widget>>,
198        F: Into<Option<Widget>>,
199        G: Into<Option<Widget>>,
200        H: Into<Option<Widget>>,
201        I: Into<Option<Widget>>,
202        J: Into<Option<Widget>>,
203    > From<(A, B, C, D, E, F, G, H, I, J)> for OptWidgetList
204{
205    fn from((a, b, c, d, e, f, g, h, i, j): (A, B, C, D, E, F, G, H, I, J)) -> Self {
206        OptWidgetList(vec![
207            a.into(),
208            b.into(),
209            c.into(),
210            d.into(),
211            e.into(),
212            f.into(),
213            g.into(),
214            h.into(),
215            i.into(),
216            j.into(),
217        ])
218    }
219}
220
221impl<
222        A: Into<Option<Widget>>,
223        B: Into<Option<Widget>>,
224        C: Into<Option<Widget>>,
225        D: Into<Option<Widget>>,
226        E: Into<Option<Widget>>,
227        F: Into<Option<Widget>>,
228        G: Into<Option<Widget>>,
229        H: Into<Option<Widget>>,
230        I: Into<Option<Widget>>,
231        J: Into<Option<Widget>>,
232        K: Into<Option<Widget>>,
233    > From<(A, B, C, D, E, F, G, H, I, J, K)> for OptWidgetList
234{
235    fn from((a, b, c, d, e, f, g, h, i, j, k): (A, B, C, D, E, F, G, H, I, J, K)) -> Self {
236        OptWidgetList(vec![
237            a.into(),
238            b.into(),
239            c.into(),
240            d.into(),
241            e.into(),
242            f.into(),
243            g.into(),
244            h.into(),
245            i.into(),
246            j.into(),
247            k.into(),
248        ])
249    }
250}
251
252impl<
253        A: Into<Option<Widget>>,
254        B: Into<Option<Widget>>,
255        C: Into<Option<Widget>>,
256        D: Into<Option<Widget>>,
257        E: Into<Option<Widget>>,
258        F: Into<Option<Widget>>,
259        G: Into<Option<Widget>>,
260        H: Into<Option<Widget>>,
261        I: Into<Option<Widget>>,
262        J: Into<Option<Widget>>,
263        K: Into<Option<Widget>>,
264        L: Into<Option<Widget>>,
265    > From<(A, B, C, D, E, F, G, H, I, J, K, L)> for OptWidgetList
266{
267    fn from((a, b, c, d, e, f, g, h, i, j, k, l): (A, B, C, D, E, F, G, H, I, J, K, L)) -> Self {
268        OptWidgetList(vec![
269            a.into(),
270            b.into(),
271            c.into(),
272            d.into(),
273            e.into(),
274            f.into(),
275            g.into(),
276            h.into(),
277            i.into(),
278            j.into(),
279            k.into(),
280            l.into(),
281        ])
282    }
283}
284
285impl<
286        A: Into<Option<Widget>>,
287        B: Into<Option<Widget>>,
288        C: Into<Option<Widget>>,
289        D: Into<Option<Widget>>,
290        E: Into<Option<Widget>>,
291        F: Into<Option<Widget>>,
292        G: Into<Option<Widget>>,
293        H: Into<Option<Widget>>,
294        I: Into<Option<Widget>>,
295        J: Into<Option<Widget>>,
296        K: Into<Option<Widget>>,
297        L: Into<Option<Widget>>,
298        M: Into<Option<Widget>>,
299    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M)> for OptWidgetList
300{
301    fn from(
302        (a, b, c, d, e, f, g, h, i, j, k, l, m): (A, B, C, D, E, F, G, H, I, J, K, L, M),
303    ) -> Self {
304        OptWidgetList(vec![
305            a.into(),
306            b.into(),
307            c.into(),
308            d.into(),
309            e.into(),
310            f.into(),
311            g.into(),
312            h.into(),
313            i.into(),
314            j.into(),
315            k.into(),
316            l.into(),
317            m.into(),
318        ])
319    }
320}
321
322impl<
323        A: Into<Option<Widget>>,
324        B: Into<Option<Widget>>,
325        C: Into<Option<Widget>>,
326        D: Into<Option<Widget>>,
327        E: Into<Option<Widget>>,
328        F: Into<Option<Widget>>,
329        G: Into<Option<Widget>>,
330        H: Into<Option<Widget>>,
331        I: Into<Option<Widget>>,
332        J: Into<Option<Widget>>,
333        K: Into<Option<Widget>>,
334        L: Into<Option<Widget>>,
335        M: Into<Option<Widget>>,
336        N: Into<Option<Widget>>,
337    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N)> for OptWidgetList
338{
339    fn from(
340        (a, b, c, d, e, f, g, h, i, j, k, l, m, n): (A, B, C, D, E, F, G, H, I, J, K, L, M, N),
341    ) -> Self {
342        OptWidgetList(vec![
343            a.into(),
344            b.into(),
345            c.into(),
346            d.into(),
347            e.into(),
348            f.into(),
349            g.into(),
350            h.into(),
351            i.into(),
352            j.into(),
353            k.into(),
354            l.into(),
355            m.into(),
356            n.into(),
357        ])
358    }
359}
360
361impl<
362        A: Into<Option<Widget>>,
363        B: Into<Option<Widget>>,
364        C: Into<Option<Widget>>,
365        D: Into<Option<Widget>>,
366        E: Into<Option<Widget>>,
367        F: Into<Option<Widget>>,
368        G: Into<Option<Widget>>,
369        H: Into<Option<Widget>>,
370        I: Into<Option<Widget>>,
371        J: Into<Option<Widget>>,
372        K: Into<Option<Widget>>,
373        L: Into<Option<Widget>>,
374        M: Into<Option<Widget>>,
375        N: Into<Option<Widget>>,
376        O: Into<Option<Widget>>,
377    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O)> for OptWidgetList
378{
379    fn from(
380        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o): (
381            A,
382            B,
383            C,
384            D,
385            E,
386            F,
387            G,
388            H,
389            I,
390            J,
391            K,
392            L,
393            M,
394            N,
395            O,
396        ),
397    ) -> Self {
398        OptWidgetList(vec![
399            a.into(),
400            b.into(),
401            c.into(),
402            d.into(),
403            e.into(),
404            f.into(),
405            g.into(),
406            h.into(),
407            i.into(),
408            j.into(),
409            k.into(),
410            l.into(),
411            m.into(),
412            n.into(),
413            o.into(),
414        ])
415    }
416}
417
418impl<
419        A: Into<Option<Widget>>,
420        B: Into<Option<Widget>>,
421        C: Into<Option<Widget>>,
422        D: Into<Option<Widget>>,
423        E: Into<Option<Widget>>,
424        F: Into<Option<Widget>>,
425        G: Into<Option<Widget>>,
426        H: Into<Option<Widget>>,
427        I: Into<Option<Widget>>,
428        J: Into<Option<Widget>>,
429        K: Into<Option<Widget>>,
430        L: Into<Option<Widget>>,
431        M: Into<Option<Widget>>,
432        N: Into<Option<Widget>>,
433        O: Into<Option<Widget>>,
434        P: Into<Option<Widget>>,
435    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P)> for OptWidgetList
436{
437    fn from(
438        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p): (
439            A,
440            B,
441            C,
442            D,
443            E,
444            F,
445            G,
446            H,
447            I,
448            J,
449            K,
450            L,
451            M,
452            N,
453            O,
454            P,
455        ),
456    ) -> Self {
457        OptWidgetList(vec![
458            a.into(),
459            b.into(),
460            c.into(),
461            d.into(),
462            e.into(),
463            f.into(),
464            g.into(),
465            h.into(),
466            i.into(),
467            j.into(),
468            k.into(),
469            l.into(),
470            m.into(),
471            n.into(),
472            o.into(),
473            p.into(),
474        ])
475    }
476}
477
478impl<
479        A: Into<Option<Widget>>,
480        B: Into<Option<Widget>>,
481        C: Into<Option<Widget>>,
482        D: Into<Option<Widget>>,
483        E: Into<Option<Widget>>,
484        F: Into<Option<Widget>>,
485        G: Into<Option<Widget>>,
486        H: Into<Option<Widget>>,
487        I: Into<Option<Widget>>,
488        J: Into<Option<Widget>>,
489        K: Into<Option<Widget>>,
490        L: Into<Option<Widget>>,
491        M: Into<Option<Widget>>,
492        N: Into<Option<Widget>>,
493        O: Into<Option<Widget>>,
494        P: Into<Option<Widget>>,
495        Q: Into<Option<Widget>>,
496    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q)> for OptWidgetList
497{
498    fn from(
499        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q): (
500            A,
501            B,
502            C,
503            D,
504            E,
505            F,
506            G,
507            H,
508            I,
509            J,
510            K,
511            L,
512            M,
513            N,
514            O,
515            P,
516            Q,
517        ),
518    ) -> Self {
519        OptWidgetList(vec![
520            a.into(),
521            b.into(),
522            c.into(),
523            d.into(),
524            e.into(),
525            f.into(),
526            g.into(),
527            h.into(),
528            i.into(),
529            j.into(),
530            k.into(),
531            l.into(),
532            m.into(),
533            n.into(),
534            o.into(),
535            p.into(),
536            q.into(),
537        ])
538    }
539}
540
541impl<
542        A: Into<Option<Widget>>,
543        B: Into<Option<Widget>>,
544        C: Into<Option<Widget>>,
545        D: Into<Option<Widget>>,
546        E: Into<Option<Widget>>,
547        F: Into<Option<Widget>>,
548        G: Into<Option<Widget>>,
549        H: Into<Option<Widget>>,
550        I: Into<Option<Widget>>,
551        J: Into<Option<Widget>>,
552        K: Into<Option<Widget>>,
553        L: Into<Option<Widget>>,
554        M: Into<Option<Widget>>,
555        N: Into<Option<Widget>>,
556        O: Into<Option<Widget>>,
557        P: Into<Option<Widget>>,
558        Q: Into<Option<Widget>>,
559        R: Into<Option<Widget>>,
560    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R)> for OptWidgetList
561{
562    fn from(
563        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r): (
564            A,
565            B,
566            C,
567            D,
568            E,
569            F,
570            G,
571            H,
572            I,
573            J,
574            K,
575            L,
576            M,
577            N,
578            O,
579            P,
580            Q,
581            R,
582        ),
583    ) -> Self {
584        OptWidgetList(vec![
585            a.into(),
586            b.into(),
587            c.into(),
588            d.into(),
589            e.into(),
590            f.into(),
591            g.into(),
592            h.into(),
593            i.into(),
594            j.into(),
595            k.into(),
596            l.into(),
597            m.into(),
598            n.into(),
599            o.into(),
600            p.into(),
601            q.into(),
602            r.into(),
603        ])
604    }
605}
606
607impl<
608        A: Into<Option<Widget>>,
609        B: Into<Option<Widget>>,
610        C: Into<Option<Widget>>,
611        D: Into<Option<Widget>>,
612        E: Into<Option<Widget>>,
613        F: Into<Option<Widget>>,
614        G: Into<Option<Widget>>,
615        H: Into<Option<Widget>>,
616        I: Into<Option<Widget>>,
617        J: Into<Option<Widget>>,
618        K: Into<Option<Widget>>,
619        L: Into<Option<Widget>>,
620        M: Into<Option<Widget>>,
621        N: Into<Option<Widget>>,
622        O: Into<Option<Widget>>,
623        P: Into<Option<Widget>>,
624        Q: Into<Option<Widget>>,
625        R: Into<Option<Widget>>,
626        S: Into<Option<Widget>>,
627    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S)> for OptWidgetList
628{
629    fn from(
630        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s): (
631            A,
632            B,
633            C,
634            D,
635            E,
636            F,
637            G,
638            H,
639            I,
640            J,
641            K,
642            L,
643            M,
644            N,
645            O,
646            P,
647            Q,
648            R,
649            S,
650        ),
651    ) -> Self {
652        OptWidgetList(vec![
653            a.into(),
654            b.into(),
655            c.into(),
656            d.into(),
657            e.into(),
658            f.into(),
659            g.into(),
660            h.into(),
661            i.into(),
662            j.into(),
663            k.into(),
664            l.into(),
665            m.into(),
666            n.into(),
667            o.into(),
668            p.into(),
669            q.into(),
670            r.into(),
671            s.into(),
672        ])
673    }
674}
675
676impl<
677        A: Into<Option<Widget>>,
678        B: Into<Option<Widget>>,
679        C: Into<Option<Widget>>,
680        D: Into<Option<Widget>>,
681        E: Into<Option<Widget>>,
682        F: Into<Option<Widget>>,
683        G: Into<Option<Widget>>,
684        H: Into<Option<Widget>>,
685        I: Into<Option<Widget>>,
686        J: Into<Option<Widget>>,
687        K: Into<Option<Widget>>,
688        L: Into<Option<Widget>>,
689        M: Into<Option<Widget>>,
690        N: Into<Option<Widget>>,
691        O: Into<Option<Widget>>,
692        P: Into<Option<Widget>>,
693        Q: Into<Option<Widget>>,
694        R: Into<Option<Widget>>,
695        S: Into<Option<Widget>>,
696        T: Into<Option<Widget>>,
697    > From<(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T)> for OptWidgetList
698{
699    fn from(
700        (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t): (
701            A,
702            B,
703            C,
704            D,
705            E,
706            F,
707            G,
708            H,
709            I,
710            J,
711            K,
712            L,
713            M,
714            N,
715            O,
716            P,
717            Q,
718            R,
719            S,
720            T,
721        ),
722    ) -> Self {
723        OptWidgetList(vec![
724            a.into(),
725            b.into(),
726            c.into(),
727            d.into(),
728            e.into(),
729            f.into(),
730            g.into(),
731            h.into(),
732            i.into(),
733            j.into(),
734            k.into(),
735            l.into(),
736            m.into(),
737            n.into(),
738            o.into(),
739            p.into(),
740            q.into(),
741            r.into(),
742            s.into(),
743            t.into(),
744        ])
745    }
746}