css_parse/traits/
to_cursors.rs1use crate::{Cursor, CursorSink};
2use bumpalo::collections::Vec;
3
4pub trait ToCursors {
16 fn to_cursors(&self, s: &mut impl CursorSink);
17}
18
19impl ToCursors for Cursor {
20 fn to_cursors(&self, s: &mut impl CursorSink) {
21 s.append(*self);
22 }
23}
24
25impl<T> ToCursors for Option<T>
26where
27 T: ToCursors,
28{
29 fn to_cursors(&self, s: &mut impl CursorSink) {
30 if let Some(t) = self {
31 ToCursors::to_cursors(t, s);
32 }
33 }
34}
35
36impl<'a, T> ToCursors for Vec<'a, T>
37where
38 T: ToCursors,
39{
40 fn to_cursors(&self, s: &mut impl CursorSink) {
41 for item in self.iter() {
42 ToCursors::to_cursors(item, s);
43 }
44 }
45}
46
47macro_rules! impl_tuple {
48 ($($T:ident),*) => {
49 impl<$($T),*> ToCursors for ($($T),*)
50 where
51 $($T: ToCursors,)*
52 {
53 #[allow(non_snake_case)]
54 #[allow(unused)]
55 fn to_cursors(&self, s: &mut impl CursorSink) {
56 let ($($T),*) = self;
57 $($T.to_cursors(s);)*
58 }
59 }
60 };
61}
62
63impl_tuple!(A, B);
64impl_tuple!(A, B, C);
65impl_tuple!(A, B, C, D);
66impl_tuple!(A, B, C, D, E);
67impl_tuple!(A, B, C, D, E, F);
68impl_tuple!(A, B, C, D, E, F, G);
69impl_tuple!(A, B, C, D, E, F, G, H);
70impl_tuple!(A, B, C, D, E, F, G, H, I);
71impl_tuple!(A, B, C, D, E, F, G, H, I, J);
72impl_tuple!(A, B, C, D, E, F, G, H, I, J, K);
73impl_tuple!(A, B, C, D, E, F, G, H, I, J, K, L);