1
1
use proc_macro2:: TokenStream ;
2
2
use quote:: quote;
3
- use serde_derive_internals:: { attr:: get_serde_meta_items, Ctxt } ;
4
- use syn:: { parse_macro_input, Data , DataStruct , DeriveInput , Fields , Ident , Lit , Meta , NestedMeta } ;
5
-
6
- /// Parses `#[serde(skip_serializing)]` and `#[serde(skip_deserializing)]`
7
- fn serde_skipped ( cx : & Ctxt , attrs : & [ syn:: Attribute ] ) -> bool {
8
- for meta_items in attrs
9
- . iter ( )
10
- . filter_map ( |attr| get_serde_meta_items ( cx, attr) . ok ( ) )
11
- {
12
- for meta_item in meta_items {
13
- match meta_item {
14
- NestedMeta :: Meta ( Meta :: Path ( path) )
15
- if path
16
- . get_ident ( )
17
- // will not work with skip_serializing_if
18
- . map_or ( false , |i| * i == "skip_serializing" || * i == "skip_deserializing" ) =>
19
- {
20
- return true
21
- }
22
- _ => continue ,
23
- }
24
- }
25
- }
26
- false
27
- }
28
-
29
- /// Parses `#[serde(rename = "..")]`
30
- fn serde_rename ( cx : & Ctxt , field : & syn:: Field ) -> Option < String > {
31
- for meta_items in field
32
- . attrs
33
- . iter ( )
34
- . filter_map ( |attr| get_serde_meta_items ( cx, attr) . ok ( ) )
35
- {
36
- for meta_item in meta_items {
37
- match meta_item {
38
- NestedMeta :: Meta ( Meta :: NameValue ( nv) )
39
- if nv
40
- . path
41
- . get_ident ( )
42
- . map_or ( false , |i| * i == "rename" ) =>
43
- {
44
- if let Lit :: Str ( lit) = nv. lit {
45
- return Some ( lit. value ( ) ) ;
46
- }
47
- }
48
- _ => continue ,
49
- }
50
- }
51
- }
52
- None
53
- }
54
-
55
- fn unraw ( ident : & Ident ) -> String {
56
- ident. to_string ( ) . trim_start_matches ( "r#" ) . to_owned ( )
57
- }
3
+ use serde_derive_internals:: {
4
+ attr:: { Default as SerdeDefault , Field } ,
5
+ Ctxt ,
6
+ } ;
7
+ use syn:: { parse_macro_input, Data , DataStruct , DeriveInput , Fields } ;
58
8
59
9
fn column_names ( data : & DataStruct ) -> TokenStream {
60
10
match & data. fields {
@@ -63,11 +13,10 @@ fn column_names(data: &DataStruct) -> TokenStream {
63
13
let column_names_iter = fields
64
14
. named
65
15
. iter ( )
66
- . filter ( |f| !serde_skipped ( & cx, & f. attrs ) )
67
- . map ( |f| match serde_rename ( & cx, f) {
68
- Some ( name) => name,
69
- None => unraw ( f. ident . as_ref ( ) . unwrap ( ) ) ,
70
- } ) ;
16
+ . enumerate ( )
17
+ . map ( |( index, field) | Field :: from_ast ( & cx, index, field, None , & SerdeDefault :: None ) )
18
+ . filter ( |field| !field. skip_serializing ( ) && !field. skip_deserializing ( ) )
19
+ . map ( |field| field. name ( ) . serialize_name ( ) . to_string ( ) ) ;
71
20
72
21
let tokens = quote ! {
73
22
& [ #( #column_names_iter, ) * ]
0 commit comments