m3rs_snippets/
lib.rs

1use proc_macro::{TokenStream, TokenTree};
2use quote::{format_ident, quote};
3
4/// this crate contains the utilty for write examples snippets
5///
6/// usage:
7///
8/// ```rust
9/// #[snippet]
10/// pub fn example() -> web_sys::HtmlElement {
11///     let elem = ..;
12///     //...
13///     //...
14///     elem
15/// }
16///
17/// fn main() {
18///     let code = example_snippet();
19///     println!("{code}");
20/// }
21/// ```
22#[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}