1pub(crate) mod ast;
4pub(crate) mod codegen;
5
6#[proc_macro_derive(Message, attributes(gin))]
7pub fn message_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
9 let input = syn::parse_macro_input!(input as syn::DeriveInput);
10 let input: ast::MessageInput = match darling::FromDeriveInput::from_derive_input(&input) {
11 Ok(parsed) => parsed,
12 Err(err) => {
13 return err.write_errors().into();
14 }
15 };
16
17 let root = input
18 .root
19 .as_ref()
20 .map(|path| quote::quote!(#path))
21 .unwrap_or(quote::quote! {
22 ::gin_tonic
23 });
24
25 codegen::expand_message(&root, input).into()
26}
27
28#[proc_macro_derive(Enumeration, attributes(gin))]
29pub fn enum_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
31 let input = syn::parse_macro_input!(input as syn::DeriveInput);
32 let input: ast::EnumerationInput = match darling::FromDeriveInput::from_derive_input(&input) {
33 Ok(parsed) => parsed,
34 Err(err) => {
35 return err.write_errors().into();
36 }
37 };
38
39 let root = input
40 .root
41 .as_ref()
42 .map(|path| quote::quote!(#path))
43 .unwrap_or(quote::quote! {
44 ::gin_tonic
45 });
46
47 codegen::expand_enumeration(&root, input).into()
48}
49
50#[proc_macro_derive(OneOf, attributes(gin))]
51pub fn one_of_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
53 let input = syn::parse_macro_input!(input as syn::DeriveInput);
54 let input: ast::OneOfInput = match darling::FromDeriveInput::from_derive_input(&input) {
55 Ok(parsed) => parsed,
56 Err(err) => {
57 return err.write_errors().into();
58 }
59 };
60
61 let root = input
62 .root
63 .as_ref()
64 .map(|path| quote::quote!(#path))
65 .unwrap_or(quote::quote! {
66 ::gin_tonic
67 });
68
69 codegen::one_of_enumeration(&root, input).into()
70}