1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::parse_macro_input;
6
7mod client;
8mod stub;
9
10#[proc_macro_attribute]
12pub fn service(_args: TokenStream, input: TokenStream) -> TokenStream {
13 let item = parse_macro_input!(input as syn::ItemTrait);
14 let client = client::dapr_client(&item);
15 let expanded = quote! {
16 #item
17 #client
18 };
19 TokenStream::from(expanded)
20}
21
22#[proc_macro_attribute]
24pub fn stub(_args: TokenStream, input: TokenStream) -> TokenStream {
25 let item = parse_macro_input!(input as syn::ItemTrait);
26 let stub = stub::dapr_stub(&item);
27 let syn::ItemTrait {
28 attrs,
29 vis,
30 ident,
31 generics,
32 colon_token,
33 supertraits,
34 mut items,
35 ..
36 } = item;
37 let (_impl_generics, ty_generics, where_clause) = generics.split_for_impl();
38
39 let items = items.iter_mut().map(|item| {
40 if let syn::TraitItem::Method(ref mut method) = item {
41 method.sig.output = stub::output_type(&method.sig.output);
42
43 quote! { async #method }
44 } else {
45 quote! { #item }
46 }
47 });
48
49 let expanded = quote! {
50 #[::dapr::async_trait]
51 #(#attrs)* #vis trait #ident #ty_generics #colon_token #supertraits #where_clause {
52 #(#items)*
53 }
54 #stub
55 };
56 println!("{}", expanded);
57 TokenStream::from(expanded)
58}