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