1mod contract;
2mod meta;
3mod resource;
4mod symbol;
5mod util;
6
7use crate::resource::Resource;
8use contract::Contract;
9use proc_macro::TokenStream;
10use proc_macro2::{Ident, Span};
11use syn::{parse_macro_input, ItemTrait, TraitItemFn};
12
13#[proc_macro_attribute]
14pub fn hadorn(args: TokenStream, stream: TokenStream) -> TokenStream {
15 let resource = parse_macro_input!(args as Resource);
16 let item = parse_macro_input!(stream as ItemTrait);
17 resource
18 .expand(item)
19 .expect("expand attribute `resource` failed`")
20 .into()
21}
22
23macro_rules! http_method {
24 (get) => {
25 "GET"
26 };
27 (post) => {
28 "POST"
29 };
30 (put) => {
31 "PUT"
32 };
33 (delete) => {
34 "DELETE"
35 };
36 (head) => {
37 "HEAD"
38 };
39 (options) => {
40 "OPTIONS"
41 };
42 (trace) => {
43 "TRACE"
44 };
45}
46
47macro_rules! impl_methods {
48 ($($method:ident),* $(,)?) => {
49 $(
50 #[doc = concat!("Auto generate http call for [`", http_method!($method), "`]")]
51 #[proc_macro_attribute]
52 pub fn $method(args: TokenStream, input: TokenStream) -> TokenStream {
53 let item = parse_macro_input!(input as TraitItemFn);
54 let mut contract = parse_macro_input!(args as Contract);
55 contract.method = Some(Ident::new(http_method!($method), Span::call_site()));
56 contract.expand(item).expect(concat!("expand attribute `", stringify!($method) ,"` failed")).into()
57 }
58 )*
59 };
60}
61
62impl_methods!(get, post, put, delete, head, options, trace);