@@ -4,7 +4,7 @@ use proc_macro::TokenStream;
4
4
5
5
use proc_macro2:: { Ident , TokenStream as TokenStream2 } ;
6
6
use quote:: quote;
7
- use syn:: { parse_macro_input, Data , DeriveInput , Field , Fields , LitStr } ;
7
+ use syn:: { parse_macro_input, Attribute , Data , DeriveInput , Field , Fields , LitStr , Variant } ;
8
8
9
9
#[ proc_macro_derive( LoadEnv , attributes( econf) ) ]
10
10
pub fn load_env ( input : TokenStream ) -> TokenStream {
@@ -37,9 +37,9 @@ fn is_skip(f: &Field) -> bool {
37
37
} )
38
38
}
39
39
40
- fn find_renaming ( f : & Field ) -> Option < String > {
40
+ fn find_renaming ( attrs : & [ Attribute ] ) -> Option < String > {
41
41
let mut rename = None ;
42
- for attr in & f . attrs {
42
+ for attr in attrs {
43
43
if attr. path ( ) . is_ident ( "econf" ) {
44
44
attr. parse_nested_meta ( |meta| {
45
45
if meta. path . is_ident ( "rename" ) {
@@ -56,6 +56,14 @@ fn find_renaming(f: &Field) -> Option<String> {
56
56
rename
57
57
}
58
58
59
+ fn find_field_renaming ( f : & Field ) -> Option < String > {
60
+ find_renaming ( & f. attrs )
61
+ }
62
+
63
+ fn find_variant_renaming ( v : & Variant ) -> Option < String > {
64
+ find_renaming ( & v. attrs )
65
+ }
66
+
59
67
fn content ( name : & Ident , data : & Data ) -> TokenStream2 {
60
68
match data {
61
69
Data :: Struct ( data) => match & data. fields {
@@ -67,7 +75,7 @@ fn content(name: &Ident, data: &Data) -> TokenStream2 {
67
75
#ident: self . #ident,
68
76
} ;
69
77
}
70
- match find_renaming ( f) {
78
+ match find_field_renaming ( f) {
71
79
Some ( overwritten_name) => quote ! {
72
80
#ident: self . #ident. load( & ( path. to_owned( ) + "_" + #overwritten_name) , loader) ,
73
81
} ,
@@ -89,7 +97,7 @@ fn content(name: &Ident, data: &Data) -> TokenStream2 {
89
97
if is_skip ( f) {
90
98
return quote ! { self . #i, } ;
91
99
}
92
- match find_renaming ( f) {
100
+ match find_field_renaming ( f) {
93
101
Some ( overwritten_name) => quote ! {
94
102
self . #i. load( & ( path. to_owned( ) + "_" + #overwritten_name) , loader) ,
95
103
} ,
@@ -114,7 +122,11 @@ fn content(name: &Ident, data: &Data) -> TokenStream2 {
114
122
} ) ;
115
123
116
124
let enums0 = data. variants . iter ( ) . map ( |_| & name) ;
117
- let enums1 = data. variants . iter ( ) . map ( |f| & f. ident ) ;
125
+ let enums1 = data. variants . iter ( ) . map ( |f| {
126
+ find_variant_renaming ( f)
127
+ . map ( |overwritten_name| Ident :: new ( & overwritten_name, f. ident . span ( ) ) )
128
+ . unwrap_or_else ( || f. ident . clone ( ) )
129
+ } ) ;
118
130
let enums2 = data. variants . iter ( ) . map ( |f| & f. ident ) ;
119
131
120
132
quote ! {
0 commit comments