1use proc_macro::{TokenStream, TokenTree};
2use quote::{format_ident, quote};
3
4#[proc_macro_attribute]
23pub fn snippet(_: TokenStream, item: TokenStream) -> TokenStream {
24 let syntax_tree = syn::parse_file(&item.to_string()).unwrap();
25 let formatted_code = prettier_please::unparse(&syntax_tree);
26
27 let mut item = item;
28
29 let ident = item
30 .clone()
31 .into_iter()
32 .find(|t| match t {
33 TokenTree::Ident(i) => {
34 if i.to_string().ne("pub")
35 && i.to_string().ne("fn")
36 && i.to_string().ne("async")
37 && i.to_string().ne("extern")
38 && i.to_string().ne("unsafe")
39 {
40 return true;
41 }
42 false
43 }
44 _ => false,
45 })
46 .unwrap();
47
48 let ident = ident.to_string();
49 let ident = format_ident!("{ident}_snippet");
50
51 let code = quote! {
52 pub fn #ident() -> String {
53 #formatted_code.to_string()
54 }
55 };
56
57 let code = TokenStream::from(code);
58
59 item.extend(code);
60
61 item
62}