extern crate proc_macro; use proc_macro::TokenStream; use proc_macro2::{Ident, Literal, Span}; use quote::quote; use syn::{Field, LitInt}; #[proc_macro] pub fn concat_idents(input: TokenStream) -> TokenStream { let mut buffer = String::new(); for token in input { buffer.push_str(&token.to_string()); } let mut stream = proc_macro2::TokenStream::new(); stream.extend([Ident::new(&buffer, Span::call_site())]); stream.into() } #[proc_macro] pub fn number_to_generic(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let identifier = Ident::new( match number { 0 => "A", 1 => "B", 2 => "C", 3 => "D", 4 => "E", 5 => "F", 6 => "G", 7 => "H", 8 => "I", 9 => "J", 10 => "K", 11 => "L", 12 => "M", 13 => "N", 14 => "O", 15 => "P", 16 => "Q", 17 => "R", 18 => "S", 19 => "T", 20 => "U", 21 => "V", 22 => "W", 23 => "X", 24 => "Y", 25 => "Z", _ => panic!("Expected a number less than 26"), }, Span::call_site(), ); quote! { #identifier }.into() } #[proc_macro] pub fn tuple_type_len(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = 0..number; quote! { (#(::varihappy_macros::number_to_generic!(#num),)*) }.into() } #[proc_macro] pub fn tuple_type_ref(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = 0..number; quote! { (#(&'a ::varihappy_macros::number_to_generic!(#num),)*) }.into() } #[proc_macro] pub fn tuple_type_mut(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = 0..number; quote! { (#(&'a mut ::varihappy_macros::number_to_generic!(#num),)*) }.into() } #[proc_macro] pub fn reverse_tuple_type(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = (0..number).rev(); quote! { (#(::varihappy_macros::number_to_generic!(#num),)*) }.into() } #[proc_macro] pub fn tuple_type_len_rest(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = 1..number; quote! { (#(::varihappy_macros::number_to_generic!(#num),)*) }.into() } #[proc_macro] pub fn tuple_expr_ref(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = (0..number).map(Literal::u128_unsuffixed); quote! { (#(&self.#num,)*) }.into() } #[proc_macro] pub fn tuple_expr_mut(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = (0..number).map(Literal::u128_unsuffixed); quote! { (#(&mut self.#num,)*) }.into() } #[proc_macro] pub fn reverse_expr_type(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = (0..number).rev().map(Literal::u128_unsuffixed); quote! { (#(self.#num,)*) }.into() } #[proc_macro] pub fn tuple_expr_len_rest(input: TokenStream) -> TokenStream { let number = syn::parse_macro_input!(input as LitInt); let number: u128 = number.base10_parse().expect("a number 0..=u128::MAX"); let num = (1..number).map(Literal::u128_unsuffixed); quote! { (#(self.#num,)*) }.into() }