multi_rpc_macros/
lib.rs

1use proc_macro::TokenStream;
2use quote::quote;
3use syn::parse_macro_input;
4use syn::ItemImpl;
5use syn::ItemTrait;
6
7mod protocols;
8use protocols::JsonRpSee;
9use protocols::Protocol;
10use protocols::RestAxum;
11use protocols::Tarpc;
12
13const PROTOCOLS: &[&dyn Protocol] = &[&Tarpc, &RestAxum, &JsonRpSee];
14
15#[proc_macro_attribute]
16pub fn multi_rpc_trait(_attr: TokenStream, input: TokenStream) -> TokenStream {
17    let item_trait = parse_macro_input!(input as ItemTrait);
18
19    let generated_trait_code: Vec<_> = PROTOCOLS
20        .iter()
21        .map(|p| p.transform_trait(&item_trait))
22        .collect();
23
24    quote! {
25        #item_trait
26        #(#generated_trait_code)*
27    }
28    .into()
29}
30
31#[proc_macro_attribute]
32pub fn multi_rpc_impl(_attr: TokenStream, input: TokenStream) -> TokenStream {
33    let item_impl = parse_macro_input!(input as ItemImpl);
34
35    let generated_impl_code: Vec<_> = PROTOCOLS
36        .iter()
37        .map(|p| p.transform_impl(&item_impl))
38        .collect();
39
40    quote! {
41        #item_impl
42
43        #(#generated_impl_code)*
44    }
45    .into()
46}
47
48#[proc_macro_attribute]
49pub fn rest(_attr: TokenStream, item: TokenStream) -> TokenStream {
50    item
51}