dremoc_macro/
lib.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
mod service;
mod utils;
use quote::quote;
use syn::{meta, parse_macro_input};

#[proc_macro_attribute]
pub fn service(
    args: proc_macro::TokenStream,
    input: proc_macro::TokenStream,
) -> proc_macro::TokenStream {
    let mut service = parse_macro_input!(input as service::Service);
    let meta_parser = meta::parser(|meta| service.parse_meta(meta));
    parse_macro_input!(args with meta_parser);

    let trait_def = service.trait_def();
    let state_trait_def = service.state_trait_def();
    let state_set_def = service.state_set_def();
    let interns_mod_name = service.interns_mod_name();
    let (handle_def, handle_interns_def) = service.handle_def();
    let target_def = service.target_def();
    let client_def = service.client_def();
    let request_enums_def = service.request_enums_def();

    quote! {
        #trait_def
        #state_trait_def
        #state_set_def
        #handle_def

        mod #interns_mod_name {
            use super::*;
            #handle_interns_def
            #target_def
            #client_def
            #request_enums_def
        }
    }
    .into()
}