Skip to content

Commit 1ce0e76

Browse files
authored
fix: Decode and Encode derives (#2940)
1 parent 240b4ff commit 1ce0e76

File tree

2 files changed

+24
-30
lines changed

2 files changed

+24
-30
lines changed

sqlx-macros-core/src/derives/decode.rs

+12-15
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use syn::punctuated::Punctuated;
99
use syn::token::Comma;
1010
use syn::{
1111
parse_quote, Arm, Data, DataEnum, DataStruct, DeriveInput, Field, Fields, FieldsNamed,
12-
FieldsUnnamed, Stmt, Variant,
12+
FieldsUnnamed, Stmt, TypeParamBound, Variant,
1313
};
1414

1515
pub fn expand_derive_decode(input: &DeriveInput) -> syn::Result<TokenStream> {
@@ -265,24 +265,21 @@ fn expand_derive_decode_struct(
265265
if cfg!(feature = "postgres") {
266266
let ident = &input.ident;
267267

268-
// extract type generics
269-
let generics = &input.generics;
270-
let (_, ty_generics, _) = generics.split_for_impl();
268+
let (_, ty_generics, where_clause) = input.generics.split_for_impl();
271269

272-
// add db type for impl generics & where clause
273-
let mut generics = generics.clone();
274-
generics.params.insert(0, parse_quote!('r));
275-
276-
let predicates = &mut generics.make_where_clause().predicates;
277-
278-
for field in fields {
279-
let ty = &field.ty;
270+
let mut generics = input.generics.clone();
280271

281-
predicates.push(parse_quote!(#ty: ::sqlx::decode::Decode<'r, ::sqlx::Postgres>));
282-
predicates.push(parse_quote!(#ty: ::sqlx::types::Type<::sqlx::Postgres>));
272+
// add db type for impl generics & where clause
273+
for type_param in &mut generics.type_params_mut() {
274+
type_param.bounds.extend::<[TypeParamBound; 2]>([
275+
parse_quote!(for<'decode> ::sqlx::decode::Decode<'decode, ::sqlx::Postgres>),
276+
parse_quote!(::sqlx::types::Type<::sqlx::Postgres>),
277+
]);
283278
}
284279

285-
let (impl_generics, _, where_clause) = generics.split_for_impl();
280+
generics.params.push(parse_quote!('r));
281+
282+
let (impl_generics, _, _) = generics.split_for_impl();
286283

287284
let reads = fields.iter().map(|field| -> Stmt {
288285
let id = &field.ident;

sqlx-macros-core/src/derives/encode.rs

+12-15
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use syn::punctuated::Punctuated;
99
use syn::token::Comma;
1010
use syn::{
1111
parse_quote, Data, DataEnum, DataStruct, DeriveInput, Expr, Field, Fields, FieldsNamed,
12-
FieldsUnnamed, Lifetime, LifetimeParam, Stmt, Variant,
12+
FieldsUnnamed, Lifetime, LifetimeParam, Stmt, TypeParamBound, Variant,
1313
};
1414

1515
pub fn expand_derive_encode(input: &DeriveInput) -> syn::Result<TokenStream> {
@@ -205,24 +205,21 @@ fn expand_derive_encode_struct(
205205
let ident = &input.ident;
206206
let column_count = fields.len();
207207

208-
// extract type generics
209-
let generics = &input.generics;
210-
let (_, ty_generics, _) = generics.split_for_impl();
208+
let (_, ty_generics, where_clause) = input.generics.split_for_impl();
211209

212-
// add db type for impl generics & where clause
213-
let mut generics = generics.clone();
214-
215-
let predicates = &mut generics.make_where_clause().predicates;
216-
217-
for field in fields {
218-
let ty = &field.ty;
210+
let mut generics = input.generics.clone();
219211

220-
predicates
221-
.push(parse_quote!(#ty: for<'q> ::sqlx::encode::Encode<'q, ::sqlx::Postgres>));
222-
predicates.push(parse_quote!(#ty: ::sqlx::types::Type<::sqlx::Postgres>));
212+
// add db type for impl generics & where clause
213+
for type_param in &mut generics.type_params_mut() {
214+
type_param.bounds.extend::<[TypeParamBound; 2]>([
215+
parse_quote!(for<'encode> ::sqlx::encode::Encode<'encode, ::sqlx::Postgres>),
216+
parse_quote!(::sqlx::types::Type<::sqlx::Postgres>),
217+
]);
223218
}
224219

225-
let (impl_generics, _, where_clause) = generics.split_for_impl();
220+
generics.params.push(parse_quote!('q));
221+
222+
let (impl_generics, _, _) = generics.split_for_impl();
226223

227224
let writes = fields.iter().map(|field| -> Stmt {
228225
let id = &field.ident;

0 commit comments

Comments
 (0)