1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemFn};
4
5#[proc_macro_attribute]
7pub fn tmp_path(_args: TokenStream, input: TokenStream) -> TokenStream {
8 let input = parse_macro_input!(input as ItemFn);
9 let syn::ItemFn {
10 attrs,
11 vis,
12 sig,
13 block,
14 } = input;
15 let tmp_path_var = quote! { tmp_path };
16 let new_block = quote! {{
17 let mut #tmp_path_var = tempfile::tempdir().unwrap().keep();
18 std::fs::create_dir_all(&#tmp_path_var).unwrap();
19
20 #block
21 }};
22 let output = quote! {
23 #(#attrs)*
24 #vis #sig
25 #new_block
26 };
27
28 TokenStream::from(output)
29}