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 sig,
59 vis,
61 block,
63 attrs,
65 } = input;
66
67
68 let contents = String::new();
70
71 println!("contents {}", contents);
72
73 let handler_expr = parse_str::<syn::Expr>(contents.as_str()).unwrap();
75
76 let statements = block.stmts;
78
79 quote!(
80 #(#attrs)*
82 #vis #sig {
84 #handler_expr;
85 let __result = {
87 #(#statements)*
88 };
89 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#[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}