wiwi/macro_util/
macro_recurse.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#[macro_export]
macro_rules! macro_recurse {
	($($stuff:tt)*) => {
		// hide potential distracting implementation details in docs
		$crate::macro_util::__macro_recurse_impl! { $($stuff)* }
	}
}
pub use macro_recurse;

#[doc(hidden)]
#[macro_export]
macro_rules! __macro_recurse_impl {
	{
		// macro to call with looped
		$macro:ident
		// to pass as is
		{ $($stuff:tt)* }
		// idents to recurse
		{ $($idents:ident)* }
	} => {
		$crate::macro_util::__macro_recurse_impl! {
			@impl
			$macro
			{ $($stuff)* }
			[$($idents)*] []
		}
	};

	{
		@exclude_zero

		// macro to call with looped
		$macro:ident
		// to pass as is
		{ $($stuff:tt)* }
		// idents to recurse
		{ $first:ident $($idents:ident)* }
	} => {
		$crate::macro_util::__macro_recurse_impl! {
			@impl
			$macro
			{ $($stuff)* }
			[$($idents)*] [$first]
		}
	};

	{
		@impl
		$macro:ident
		{ $($stuff:tt)* }
		[$next:ident $($remaining:ident)*] [$($rest:ident)*]
	} => {
		$macro! {
			@wiwi_macro_recurse
			{ $($stuff)* }
			{ $($rest)* }
		}
		$crate::macro_util::__macro_recurse_impl! {
			@impl
			$macro
			{ $($stuff)* }
			[$($remaining)*] [$($rest)* $next]
		}
	};

	{
		@impl
		$macro:ident
		{ $($stuff:tt)* }
		[] [$($rest:ident)*]
	} => {
		$macro! {
			@wiwi_macro_recurse
			{ $($stuff)* }
			{ $($rest)* }
		}
	};
}
#[doc(hidden)]
pub use __macro_recurse_impl;