use crate::utils;
use proc_macro::TokenStream;
use quote::quote;
use syn::Attribute;
use syn::{parse_macro_input, parse_quote, parse_str, ItemFn};
pub(crate) fn put_impl(args: TokenStream, input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as ItemFn);
let ItemFn {
sig,
vis,
block,
mut attrs,
} = input;
let tokens = quote!(#sig);
let req_map = utils::parse_group_extract_args(tokens);
let (path, contents) = utils::parse_token(args, req_map);
let middleware_expr = parse_str::<syn::Expr>(contents.as_str()).unwrap();
let attr: Attribute = parse_quote! {
#[actix_web::put(#path)]
};
attrs.push(attr);
let statements = block.stmts;
quote!(
#(#attrs)*
#vis #sig {
#middleware_expr;
let __result = {
#(#statements)*
};
return __result;
}
)
.into()
}