diff options
Diffstat (limited to 'varihappy-macros')
| -rw-r--r-- | varihappy-macros/src/lib.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/varihappy-macros/src/lib.rs b/varihappy-macros/src/lib.rs index 3b1cc29..1d519c2 100644 --- a/varihappy-macros/src/lib.rs +++ b/varihappy-macros/src/lib.rs @@ -212,3 +212,27 @@ pub fn tuple_len(input: TokenStream) -> TokenStream { let len = Literal::usize_unsuffixed(tuple.elems.len()); quote! { #len }.into() } + +struct ArrayTuple { + ty: syn::Type, + count: syn::LitInt, +} + +impl syn::parse::Parse for ArrayTuple { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let ty = input.parse()?; + input.parse::<syn::Token![;]>()?; + let count = input.parse()?; + + Ok(Self { ty, count }) + } +} + +#[proc_macro] +pub fn array_tuple(input: TokenStream) -> TokenStream { + let ast = syn::parse_macro_input!(input as ArrayTuple); + + let types = (0..ast.count.base10_parse::<u128>().unwrap()).map(|_| ast.ty.clone()); + + quote! { (#(#types,)*) }.into() +} |
