1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
use ::core::str::FromStr; use proc_macro::{TokenStream, TokenTree}; #[proc_macro] pub fn decl_for_range(input: TokenStream) -> TokenStream { let mut trees = input.into_iter(); let n: usize = match trees.next().expect("expected integer literal") { TokenTree::Literal(x) => x.to_string().parse().expect("expected integer literal"), _ => panic!("expected integer literal"), }; let mut code = String::new(); for x in 1..n { let name = format!("Tuple{}Iter", x); code.push_str(&format!( "decl_tuple_iter_struct!({} | {});", &name, (0..x).map(|x| x.to_string()).collect::<Vec<_>>().join(", ") )); } TokenStream::from_str(&code).unwrap() }