1
+ use syn:: Variant ;
2
+
1
3
use {
2
4
proc_macro2:: { Span , TokenStream } ,
3
5
syn:: {
@@ -99,7 +101,44 @@ fn with_mods(stream: TokenStream, mods: Vec<Path>) -> TokenStream {
99
101
. fold ( stream, |stream, path| quote ! ( #path( #stream) ) )
100
102
}
101
103
102
- pub fn convert ( name : & Path , fields : Fields ) -> Result < TokenStream > {
104
+ pub fn enum_convert ( name : & Path , variant : & Variant ) -> Result < TokenStream > {
105
+ let fields = variant. fields . clone ( ) ;
106
+ Ok ( match fields {
107
+ Fields :: Named ( fields) => {
108
+ let fields: Vec < _ > = fields
109
+ . named
110
+ . into_iter ( )
111
+ . map ( |field| {
112
+ let attrs = FieldAttribute :: from_attributes ( field. attrs ) ?;
113
+ Ok ( ConversionStrategy :: from_attrs ( attrs) ?
114
+ . apply ( Member :: Named ( field. ident . unwrap ( ) ) ) )
115
+ } )
116
+ . collect :: < Result < _ > > ( ) ?;
117
+ quote ! ( #name{ #( #fields, ) * } )
118
+ }
119
+ Fields :: Unnamed ( fields) => {
120
+ let fields: Vec < _ > = fields
121
+ . unnamed
122
+ . into_iter ( )
123
+ . enumerate ( )
124
+ . map ( |( i, field) | {
125
+ let attrs = FieldAttribute :: from_attributes ( field. attrs ) ?;
126
+ Ok ( ConversionStrategy :: from_attrs ( attrs) ?
127
+ . apply ( Member :: Unnamed ( Index :: from ( i) ) ) )
128
+ } )
129
+ . collect :: < Result < _ > > ( ) ?;
130
+ quote ! ( #name( #( #fields) , * ) )
131
+ }
132
+ Fields :: Unit => {
133
+ let attrs = FieldAttribute :: from_attributes ( variant. attrs . clone ( ) ) ?;
134
+ let real_name =
135
+ ConversionStrategy :: from_attrs ( attrs) ?. apply ( Member :: Unnamed ( Index :: from ( 0 ) ) ) ;
136
+ quote ! ( #real_name)
137
+ }
138
+ } )
139
+ }
140
+
141
+ pub fn struct_convert ( name : & Path , fields : Fields ) -> Result < TokenStream > {
103
142
Ok ( match fields {
104
143
Fields :: Named ( fields) => {
105
144
let fields: Vec < _ > = fields
@@ -126,6 +165,8 @@ pub fn convert(name: &Path, fields: Fields) -> Result<TokenStream> {
126
165
. collect :: < Result < _ > > ( ) ?;
127
166
quote ! ( #name( #( #fields) , * ) )
128
167
}
129
- Fields :: Unit => quote ! ( #name) ,
168
+ Fields :: Unit => {
169
+ quote ! ( #name)
170
+ }
130
171
} )
131
172
}
0 commit comments