dynamic_graphql_derive/
lib.rs

1#![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}