dynamic_graphql_derive/
lib.rs1extern 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}