1mod service;
2mod utils;
3use quote::quote;
4use syn::{meta, parse_macro_input};
5
6#[proc_macro_attribute]
7pub fn service(
8 args: proc_macro::TokenStream,
9 input: proc_macro::TokenStream,
10) -> proc_macro::TokenStream {
11 let mut service = parse_macro_input!(input as service::Service);
12 let meta_parser = meta::parser(|meta| service.parse_meta(meta));
13 parse_macro_input!(args with meta_parser);
14
15 let trait_def = service.trait_def();
16 let state_trait_def = service.state_trait_def();
17 let state_set_def = service.state_set_def();
18 let interns_mod_name = service.interns_mod_name();
19 let (handle_def, handle_interns_def) = service.handle_def();
20 let target_def = service.target_def();
21 let client_def = service.client_def();
22 let request_enums_def = service.request_enums_def();
23
24 quote! {
25 #trait_def
26 #state_trait_def
27 #state_set_def
28 #handle_def
29
30 mod #interns_mod_name {
31 use super::*;
32 #handle_interns_def
33 #target_def
34 #client_def
35 #request_enums_def
36 }
37 }
38 .into()
39}