tmp_path/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{parse_macro_input, ItemFn};
4
5/// Creates a temporary directory named `tmp_path` as a Pathbuff.
6#[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}