dynamic_graphql_derive/
lib.rs

1extern crate core;
2extern crate proc_macro;
3
4use darling::FromDeriveInput;
5use quote::quote;
6use quote::ToTokens;
7use syn::parse_macro_input;
8use syn::DeriveInput;
9
10use crate::utils::impl_block::FromItemImpl;
11use crate::utils::impl_block::FromItemTrait;
12
13mod args;
14mod utils;
15
16#[proc_macro_derive(SimpleObject, attributes(graphql))]
17pub fn drive_simple_object(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
18    match args::SimpleObject::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
19        Ok(object_args) => object_args.into_token_stream().into(),
20        Err(err) => err.write_errors().into(),
21    }
22}
23
24#[proc_macro_derive(ResolvedObject, attributes(graphql))]
25pub fn drive_resolved_object(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
26    match args::ResolvedObject::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
27        Ok(object_args) => object_args.into_token_stream().into(),
28        Err(err) => err.write_errors().into(),
29    }
30}
31
32#[proc_macro_derive(ExpandObject, attributes(graphql))]
33pub fn drive_expand_object(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
34    match args::ExpandObject::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
35        Ok(object_args) => object_args.into_token_stream().into(),
36        Err(err) => err.write_errors().into(),
37    }
38}
39
40#[proc_macro_attribute]
41#[allow(non_snake_case)]
42pub fn ResolvedObjectFields(
43    _attr: proc_macro::TokenStream,
44    item: proc_macro::TokenStream,
45) -> proc_macro::TokenStream {
46    let mut item = parse_macro_input!(item as syn::ItemImpl);
47    let data = args::ResolvedObjectFields::from_item_impl(&mut item);
48    let extension = match data {
49        Ok(obj) => obj.into_token_stream(),
50        Err(err) => err.write_errors(),
51    };
52    (quote! {
53        #item
54        #extension
55    })
56    .into()
57}
58
59#[proc_macro_derive(InputObject, attributes(graphql))]
60pub fn drive_input_object(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
61    match args::InputObject::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
62        Ok(object_args) => object_args.into_token_stream().into(),
63        Err(err) => err.write_errors().into(),
64    }
65}
66
67#[proc_macro_derive(Enum, attributes(graphql))]
68pub fn drive_enum(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
69    match args::Enum::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
70        Ok(object_args) => object_args.into_token_stream().into(),
71        Err(err) => err.write_errors().into(),
72    }
73}
74
75#[proc_macro_derive(Scalar, attributes(graphql))]
76pub fn drive_scalar(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
77    match args::Scalar::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
78        Ok(scalar_args) => scalar_args.into_token_stream().into(),
79        Err(err) => err.write_errors().into(),
80    }
81}
82
83#[proc_macro_derive(App, attributes(graphql))]
84pub fn drive_app(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
85    match args::App::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
86        Ok(object_args) => object_args.into_token_stream().into(),
87        Err(err) => err.write_errors().into(),
88    }
89}
90
91#[proc_macro_attribute]
92#[allow(non_snake_case)]
93pub fn ExpandObjectFields(
94    _attr: proc_macro::TokenStream,
95    item: proc_macro::TokenStream,
96) -> proc_macro::TokenStream {
97    let mut item = parse_macro_input!(item as syn::ItemImpl);
98    let data = args::ExpandObjectFields::from_item_impl(&mut item);
99    let extension = match data {
100        Ok(obj) => obj.into_token_stream(),
101        Err(err) => err.write_errors(),
102    };
103    (quote! {
104        #item
105        #extension
106    })
107    .into()
108}
109
110#[proc_macro_attribute]
111#[allow(non_snake_case)]
112pub fn Interface(
113    _attr: proc_macro::TokenStream,
114    item: proc_macro::TokenStream,
115) -> proc_macro::TokenStream {
116    let mut item = parse_macro_input!(item as syn::ItemTrait);
117    let data = args::Interface::from_item_trait(&mut item);
118    let extension = match data {
119        Ok(obj) => obj.into_token_stream(),
120        Err(err) => err.write_errors(),
121    };
122    (quote! {
123        #item
124        #extension
125    })
126    .into()
127}
128
129#[proc_macro_derive(Union, attributes(graphql))]
130pub fn drive_union(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
131    match args::Union::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
132        Ok(object_args) => object_args.into_token_stream().into(),
133        Err(err) => err.write_errors().into(),
134    }
135}
136
137#[proc_macro_derive(MutationRoot, attributes(graphql))]
138pub fn drive_mutation_root(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
139    match args::MutationRoot::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
140        Ok(object_args) => object_args.into_token_stream().into(),
141        Err(err) => err.write_errors().into(),
142    }
143}
144
145#[proc_macro_derive(Mutation, attributes(graphql))]
146pub fn drive_mutation(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
147    match args::Mutation::from_derive_input(&parse_macro_input!(input as DeriveInput)) {
148        Ok(object_args) => object_args.into_token_stream().into(),
149        Err(err) => err.write_errors().into(),
150    }
151}
152
153#[proc_macro_attribute]
154#[allow(non_snake_case)]
155pub fn MutationFields(
156    _attr: proc_macro::TokenStream,
157    item: proc_macro::TokenStream,
158) -> proc_macro::TokenStream {
159    let mut item = parse_macro_input!(item as syn::ItemImpl);
160    let data = args::MutationFields::from_item_impl(&mut item);
161    let extension = match data {
162        Ok(obj) => obj.into_token_stream(),
163        Err(err) => err.write_errors(),
164    };
165    (quote! {
166        #item
167        #extension
168    })
169    .into()
170}