dapr_derive/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::parse_macro_input;
6
7mod client;
8mod stub;
9
10/// Implements server side interface for the Dapr service
11#[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/// Implements client site stub for the Dapr service
23#[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}