himacros/
lib.rs

1extern crate proc_macro;
2mod empty_file;
3mod auth_file;
4mod utils;
5mod scope;
6mod gen_dist;
7mod post;
8mod tag;
9mod get;
10mod put;
11mod delete;
12mod head;
13mod route_file;
14
15use auth_file::auth_file_impl;
16use empty_file::empty_file_impl;
17use gen_dist::gen_dist_impl;
18use proc_macro::TokenStream;
19use quote::quote;
20use syn::{parse_macro_input, parse_str, ItemFn};
21use scope::scope_impl;
22use crate::post::post_impl;
23use crate::get::get_impl;
24use crate::put::put_impl;
25use crate::delete::delete_impl;
26use crate::head::head_impl;
27use crate::route_file::route_file_impl;
28use crate::tag::tag_impl;
29
30
31#[proc_macro_attribute]
32pub fn empty_file(args: TokenStream, item: TokenStream) -> TokenStream {
33    empty_file_impl(args, item)
34}
35
36#[proc_macro_attribute]
37pub fn route_file(args: TokenStream, item: TokenStream) -> TokenStream {
38    route_file_impl(args, item)
39}
40
41#[proc_macro_attribute]
42pub fn auth_file(args: TokenStream, item: TokenStream) -> TokenStream {
43    auth_file_impl(args, item)
44}
45
46#[proc_macro_attribute]
47pub fn scope(args: TokenStream, item: TokenStream) -> TokenStream {
48    scope_impl(args, item)
49}
50
51#[proc_macro_attribute]
52pub fn scope_unfold(_args: TokenStream, item: TokenStream) -> TokenStream {
53
54    let input = parse_macro_input!(item as ItemFn);
55
56    let ItemFn {
57        // 函数签名
58        sig,
59        // 函数可见性标识
60        vis,
61        // 函数体
62        block,
63        // 其他属性
64        attrs,
65    } = input;
66
67
68    //let contents = include_str!("../.././resources/scope").to_string();
69    let contents = String::new();
70
71    println!("contents {}", contents);
72
73    // 将字符串解析为Rust代码片段
74    let handler_expr = parse_str::<syn::Expr>(contents.as_str()).unwrap();
75
76    // 抽取函数体语句
77    let statements = block.stmts;
78
79    quote!(
80            // 在该函数上重复其他所有属性(保持不变)
81            #(#attrs)*
82            // 重构函数声明
83            #vis #sig {
84                #handler_expr;
85                // 创建新的块,即函数的主体部分,存储返回值作为变量,后续可返回给父函数
86                let __result = {
87                    #(#statements)*
88                };
89                // 返回结果
90                return __result;
91            }
92        ).into()
93}
94
95#[proc_macro_attribute]
96pub fn gen_dist(args: TokenStream, item: TokenStream) -> TokenStream {
97    gen_dist_impl(args, item)
98}
99
100#[proc_macro_attribute]
101pub fn tag(args: TokenStream, item: TokenStream) -> TokenStream {
102    tag_impl(args, item)
103}
104
105// https://rust.biofan.org/crates/attributes.html
106#[proc_macro_attribute]
107pub fn post(args: TokenStream, item: TokenStream) -> TokenStream {
108    post_impl(args, item)
109}
110
111#[proc_macro_attribute]
112pub fn get(args: TokenStream, item: TokenStream) -> TokenStream {
113    get_impl(args, item)
114}
115
116#[proc_macro_attribute]
117pub fn put(args: TokenStream, item: TokenStream) -> TokenStream {
118    put_impl(args, item)
119}
120
121#[proc_macro_attribute]
122pub fn delete(args: TokenStream, item: TokenStream) -> TokenStream {
123    delete_impl(args, item)
124}
125
126#[proc_macro_attribute]
127pub fn head(args: TokenStream, item: TokenStream) -> TokenStream {
128    head_impl(args, item)
129}