extern crate proc_macro;
#[macro_use]
extern crate dotenv_codegen;
mod middleware;
mod empty_file;
mod auth_file;
mod utils;
mod scope;
mod gen_dist;
mod post;
mod tag;
mod get;
mod put;
mod delete;
mod head;
use auth_file::auth_file_impl;
use empty_file::empty_file_impl;
use middleware::middleware_impl;
use gen_dist::gen_dist_impl;
use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, parse_str, ItemFn};
use scope::scope_impl;
use crate::post::post_impl;
use crate::get::get_impl;
use crate::put::put_impl;
use crate::delete::delete_impl;
use crate::head::head_impl;
use crate::tag::tag_impl;
#[proc_macro_attribute]
pub fn middleware(args: TokenStream, item: TokenStream) -> TokenStream {
middleware_impl(args, item)
}
#[proc_macro_attribute]
pub fn empty_file(args: TokenStream, item: TokenStream) -> TokenStream {
empty_file_impl(args, item)
}
#[proc_macro_attribute]
pub fn auth_file(args: TokenStream, item: TokenStream) -> TokenStream {
auth_file_impl(args, item)
}
#[proc_macro_attribute]
pub fn scope(args: TokenStream, item: TokenStream) -> TokenStream {
scope_impl(args, item)
}
#[proc_macro_attribute]
pub fn scope_unfold(_args: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as ItemFn);
let ItemFn {
sig,
vis,
block,
attrs,
} = input;
let contents = String::new();
println!("contents {}", contents);
let handler_expr = parse_str::<syn::Expr>(contents.as_str()).unwrap();
let statements = block.stmts;
quote!(
#(#attrs)*
#vis #sig {
#handler_expr;
let __result = {
#(#statements)*
};
return __result;
}
).into()
}
#[proc_macro_attribute]
pub fn gen_dist(args: TokenStream, item: TokenStream) -> TokenStream {
gen_dist_impl(args, item)
}
#[proc_macro_attribute]
pub fn tag(args: TokenStream, item: TokenStream) -> TokenStream {
tag_impl(args, item)
}
#[proc_macro_attribute]
pub fn post(args: TokenStream, item: TokenStream) -> TokenStream {
post_impl(args, item)
}
#[proc_macro_attribute]
pub fn get(args: TokenStream, item: TokenStream) -> TokenStream {
get_impl(args, item)
}
#[proc_macro_attribute]
pub fn put(args: TokenStream, item: TokenStream) -> TokenStream {
put_impl(args, item)
}
#[proc_macro_attribute]
pub fn delete(args: TokenStream, item: TokenStream) -> TokenStream {
delete_impl(args, item)
}
#[proc_macro_attribute]
pub fn head(args: TokenStream, item: TokenStream) -> TokenStream {
head_impl(args, item)
}