gin_tonic_derive/
lib.rs

1//! this crate adds derive macros for implementing [PbType](https://docs.rs/gin-tonic-core/latest/gin_tonic_core/types/trait.PbType.html) and
2//! [https://docs.rs/gin-tonic-core/latest/gin_tonic_core/types/trait.PbOneOf.html]
3pub(crate) mod ast;
4pub(crate) mod codegen;
5
6#[proc_macro_derive(Message, attributes(gin))]
7/// a macro to derive protobof messages
8pub 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))]
29/// a macro to derive enumerations
30pub 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))]
51/// a macro to derive a message as oneof if it only contains a oneof
52pub 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}