hadorn_macro/
lib.rs

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);