iat/lib.rs
1use proc_macro::TokenStream;
2use quote::quote;
3use syn::{ItemFn, parse_macro_input, parse_quote};
4
5#[proc_macro_attribute]
6pub fn captcha(_attr: TokenStream, item: TokenStream) -> TokenStream {
7 // 解析输入的 TokenStream 为一个函数项
8 let mut item_fn = parse_macro_input!(item as ItemFn);
9
10 // 使用 parse_quote! 直接解析 quote! 宏生成的 TokenStream
11 let doc_attr: syn::Attribute = parse_quote! {
12 #[doc = "@captcha"]
13 };
14
15 // 将新的属性添加到函数的所有属性的开头
16 item_fn.attrs.insert(0, doc_attr);
17
18 // 将修改后的函数项转换回 TokenStream
19 let output = quote! {
20 #item_fn
21 };
22
23 output.into()
24}