@@ -9,18 +9,17 @@ use syn::punctuated::Punctuated;
99use syn:: token:: Comma ;
1010use syn:: {
1111 parse_quote, Data , DataEnum , DataStruct , DeriveInput , Expr , Field , Fields , FieldsNamed ,
12- FieldsUnnamed , Lifetime , LifetimeParam , Stmt , TypeParamBound , Variant ,
12+ Lifetime , LifetimeParam , Stmt , TypeParamBound , Variant ,
1313} ;
1414
1515pub fn expand_derive_encode ( input : & DeriveInput ) -> syn:: Result < TokenStream > {
1616 let args = parse_container_attributes ( & input. attrs ) ?;
1717
1818 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 ( ) )
2423 }
2524 Data :: Enum ( DataEnum { variants, .. } ) => match args. repr {
2625 Some ( _) => expand_derive_encode_weak_enum ( input, variants) ,
@@ -36,7 +35,7 @@ pub fn expand_derive_encode(input: &DeriveInput) -> syn::Result<TokenStream> {
3635 ..
3736 } ) => Err ( syn:: Error :: new_spanned (
3837 input,
39- "structs with zero or more than one unnamed field are not supported " ,
38+ "tuple structs may only have a single field" ,
4039 ) ) ,
4140 Data :: Struct ( DataStruct {
4241 fields : Fields :: Unit ,
@@ -77,6 +76,12 @@ fn expand_derive_encode_transparent(
7776 . push ( parse_quote ! ( #ty: :: sqlx:: encode:: Encode <#lifetime, DB >) ) ;
7877 let ( impl_generics, _, where_clause) = generics. split_for_impl ( ) ;
7978
79+ let field_ident = if let Some ( ident) = & field. ident {
80+ quote ! { #ident }
81+ } else {
82+ quote ! { 0 }
83+ } ;
84+
8085 Ok ( quote ! (
8186 #[ automatically_derived]
8287 impl #impl_generics :: sqlx:: encode:: Encode <#lifetime, DB > for #ident #ty_generics
@@ -86,15 +91,15 @@ fn expand_derive_encode_transparent(
8691 & self ,
8792 buf: & mut <DB as :: sqlx:: database:: Database >:: ArgumentBuffer <#lifetime>,
8893 ) -> :: 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)
9095 }
9196
9297 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 )
9499 }
95100
96101 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 )
98103 }
99104 }
100105 ) )
0 commit comments