@@ -9,18 +9,17 @@ use syn::punctuated::Punctuated;
9
9
use syn:: token:: Comma ;
10
10
use syn:: {
11
11
parse_quote, Data , DataEnum , DataStruct , DeriveInput , Expr , Field , Fields , FieldsNamed ,
12
- FieldsUnnamed , Lifetime , LifetimeParam , Stmt , TypeParamBound , Variant ,
12
+ Lifetime , LifetimeParam , Stmt , TypeParamBound , Variant ,
13
13
} ;
14
14
15
15
pub fn expand_derive_encode ( input : & DeriveInput ) -> syn:: Result < TokenStream > {
16
16
let args = parse_container_attributes ( & input. attrs ) ?;
17
17
18
18
match & input. data {
19
- Data :: Struct ( DataStruct {
20
- fields : Fields :: Unnamed ( FieldsUnnamed { unnamed, .. } ) ,
21
- ..
22
- } ) if unnamed. len ( ) == 1 => {
23
- expand_derive_encode_transparent ( input, unnamed. first ( ) . unwrap ( ) )
19
+ Data :: Struct ( DataStruct { fields, .. } )
20
+ if fields. len ( ) == 1 && ( matches ! ( fields, Fields :: Unnamed ( _) ) || args. transparent ) =>
21
+ {
22
+ expand_derive_encode_transparent ( input, fields. iter ( ) . next ( ) . unwrap ( ) )
24
23
}
25
24
Data :: Enum ( DataEnum { variants, .. } ) => match args. repr {
26
25
Some ( _) => expand_derive_encode_weak_enum ( input, variants) ,
@@ -77,6 +76,12 @@ fn expand_derive_encode_transparent(
77
76
. push ( parse_quote ! ( #ty: :: sqlx:: encode:: Encode <#lifetime, DB >) ) ;
78
77
let ( impl_generics, _, where_clause) = generics. split_for_impl ( ) ;
79
78
79
+ let field_ident = if let Some ( ident) = & field. ident {
80
+ quote ! { #ident }
81
+ } else {
82
+ quote ! { 0 }
83
+ } ;
84
+
80
85
Ok ( quote ! (
81
86
#[ automatically_derived]
82
87
impl #impl_generics :: sqlx:: encode:: Encode <#lifetime, DB > for #ident #ty_generics
@@ -86,15 +91,15 @@ fn expand_derive_encode_transparent(
86
91
& self ,
87
92
buf: & mut <DB as :: sqlx:: database:: Database >:: ArgumentBuffer <#lifetime>,
88
93
) -> :: std:: result:: Result <:: sqlx:: encode:: IsNull , :: sqlx:: error:: BoxDynError > {
89
- <#ty as :: sqlx:: encode:: Encode <#lifetime, DB >>:: encode_by_ref( & self . 0 , buf)
94
+ <#ty as :: sqlx:: encode:: Encode <#lifetime, DB >>:: encode_by_ref( & self . #field_ident , buf)
90
95
}
91
96
92
97
fn produces( & self ) -> Option <DB :: TypeInfo > {
93
- <#ty as :: sqlx:: encode:: Encode <#lifetime, DB >>:: produces( & self . 0 )
98
+ <#ty as :: sqlx:: encode:: Encode <#lifetime, DB >>:: produces( & self . #field_ident )
94
99
}
95
100
96
101
fn size_hint( & self ) -> usize {
97
- <#ty as :: sqlx:: encode:: Encode <#lifetime, DB >>:: size_hint( & self . 0 )
102
+ <#ty as :: sqlx:: encode:: Encode <#lifetime, DB >>:: size_hint( & self . #field_ident )
98
103
}
99
104
}
100
105
) )
0 commit comments