1
+ // TODO: CLEAN ALL THIS SHIT UP WHAT THE FUCK IS THIS
2
+
1
3
use crate :: bail;
2
4
use proc_macro2:: TokenStream ;
3
5
use quote:: { format_ident, quote} ;
@@ -30,9 +32,13 @@ fn case_converter(case: &syn::LitStr) -> syn::Result<Converter> {
30
32
Ok ( converter)
31
33
}
32
34
35
+ fn maybe_case_converter ( case : Option < & syn:: LitStr > ) -> syn:: Result < Converter > {
36
+ case. map ( case_converter)
37
+ . unwrap_or_else ( || Ok ( |txt : & str | txt. to_string ( ) ) )
38
+ }
39
+
33
40
fn ident_adapter ( converter : Converter ) -> impl Fn ( & syn:: Ident ) -> syn:: Ident {
34
- let adapter = move |ident : & syn:: Ident | format_ident ! ( "{}" , converter( & ident. to_string( ) ) ) ;
35
- Box :: new ( adapter)
41
+ move |ident : & syn:: Ident | format_ident ! ( "{}" , converter( & ident. to_string( ) ) )
36
42
}
37
43
38
44
struct SerdeContainerOptions {
@@ -169,37 +175,45 @@ pub struct ContainerMeta {
169
175
serde_options : SerdeContainerOptions ,
170
176
}
171
177
178
+ fn collect_struct_fields < ' a , C > (
179
+ converter : & ' a C ,
180
+ crate_path : & ' a syn:: Path ,
181
+ fields : & ' a syn:: FieldsNamed ,
182
+ ) -> impl Iterator < Item = syn:: Result < TokenStream > > + ' a
183
+ where
184
+ C : Fn ( & syn:: Ident ) -> syn:: Ident ,
185
+ {
186
+ fields. named . iter ( ) . map ( move |field| {
187
+ let name = converter ( field. ident . as_ref ( ) . unwrap ( ) ) ;
188
+ let description = normalize_option ( extract_documentation ( & field. attrs ) ?) ;
189
+ let field_ty = & field. ty ;
190
+
191
+ let expanded = quote ! {
192
+ (
193
+ stringify!( #name) . into( ) ,
194
+ #crate_path:: StructProperty {
195
+ description: #description,
196
+ value: <#field_ty as #crate_path:: Schemaifier >:: visit_schema( visitor) ,
197
+ }
198
+ )
199
+ } ;
200
+
201
+ Ok ( expanded)
202
+ } )
203
+ }
204
+
172
205
fn expand_enum ( mut meta : ContainerMeta , input : DataEnum ) -> syn:: Result < TokenStream > {
173
206
let crate_path = & meta. options . crate_path ;
174
- let converter = ident_adapter (
175
- meta. serde_options
176
- . rename_all
177
- . as_ref ( )
178
- . map ( case_converter)
179
- . unwrap_or_else ( || Ok ( |txt : & str | txt. to_string ( ) ) ) ?,
180
- ) ;
207
+ let converter = ident_adapter ( maybe_case_converter (
208
+ meta. serde_options . rename_all . as_ref ( ) ,
209
+ ) ?) ;
181
210
182
211
let mut cases = Vec :: new ( ) ;
183
212
for variant in input. variants . iter ( ) {
184
213
let value = match variant. fields {
185
214
syn:: Fields :: Named ( ref fields) => {
186
- let items = fields. named . iter ( ) . map ( |field| {
187
- let name = converter ( field. ident . as_ref ( ) . unwrap ( ) ) ;
188
- let description = normalize_option ( extract_documentation ( & field. attrs ) ?) ;
189
- let field_ty = & field. ty ;
190
-
191
- let expanded = quote ! {
192
- (
193
- stringify!( #name) . into( ) ,
194
- #crate_path:: StructProperty {
195
- description: #description,
196
- value: <#field_ty as #crate_path:: Schemaifier >:: visit_schema( visitor) ,
197
- }
198
- )
199
- } ;
200
-
201
- Ok ( expanded)
202
- } ) . collect :: < syn:: Result < Vec < _ > > > ( ) ?;
215
+ let items = collect_struct_fields ( & converter, crate_path, fields)
216
+ . collect :: < syn:: Result < Vec < _ > > > ( ) ?;
203
217
204
218
quote ! {
205
219
#crate_path:: EnumValue :: Named {
@@ -269,13 +283,9 @@ fn expand_enum(mut meta: ContainerMeta, input: DataEnum) -> syn::Result<TokenStr
269
283
}
270
284
271
285
fn expand_struct ( mut meta : ContainerMeta , input : DataStruct ) -> syn:: Result < TokenStream > {
272
- let converter = ident_adapter (
273
- meta. serde_options
274
- . rename_all
275
- . as_ref ( )
276
- . map ( case_converter)
277
- . unwrap_or_else ( || Ok ( |txt : & str | txt. to_string ( ) ) ) ?,
278
- ) ;
286
+ let converter = ident_adapter ( maybe_case_converter (
287
+ meta. serde_options . rename_all . as_ref ( ) ,
288
+ ) ?) ;
279
289
280
290
let name = & meta. name ;
281
291
let description = normalize_option ( meta. description . as_ref ( ) ) ;
@@ -293,24 +303,9 @@ fn expand_struct(mut meta: ContainerMeta, input: DataStruct) -> syn::Result<Toke
293
303
}
294
304
} else {
295
305
let node_ty = match input. fields {
296
- syn:: Fields :: Named ( named) => {
297
- let items = named. named . iter ( ) . map ( |field| {
298
- let name = converter ( field. ident . as_ref ( ) . unwrap ( ) ) ;
299
- let description = normalize_option ( extract_documentation ( & field. attrs ) ?) ;
300
- let field_ty = & field. ty ;
301
-
302
- let expanded = quote ! {
303
- (
304
- stringify!( #name) . into( ) ,
305
- #crate_path:: StructProperty {
306
- description: #description,
307
- value: <#field_ty as #crate_path:: Schemaifier >:: visit_schema( visitor) ,
308
- }
309
- )
310
- } ;
311
-
312
- Ok ( expanded)
313
- } ) . collect :: < syn:: Result < Vec < _ > > > ( ) ?;
306
+ syn:: Fields :: Named ( ref named) => {
307
+ let items = collect_struct_fields ( & converter, crate_path, named)
308
+ . collect :: < syn:: Result < Vec < _ > > > ( ) ?;
314
309
315
310
quote ! {
316
311
#crate_path:: StructType :: Named {
0 commit comments