1+ use syn:: Variant ;
2+
13use {
24 proc_macro2:: { Span , TokenStream } ,
35 syn:: {
@@ -99,7 +101,44 @@ fn with_mods(stream: TokenStream, mods: Vec<Path>) -> TokenStream {
99101 . fold ( stream, |stream, path| quote ! ( #path( #stream) ) )
100102}
101103
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 > {
103142 Ok ( match fields {
104143 Fields :: Named ( fields) => {
105144 let fields: Vec < _ > = fields
@@ -126,6 +165,8 @@ pub fn convert(name: &Path, fields: Fields) -> Result<TokenStream> {
126165 . collect :: < Result < _ > > ( ) ?;
127166 quote ! ( #name( #( #fields) , * ) )
128167 }
129- Fields :: Unit => quote ! ( #name) ,
168+ Fields :: Unit => {
169+ quote ! ( #name)
170+ }
130171 } )
131172}
0 commit comments