From 4d9f2925230f2a7b7faa094c1b0d9c18f213fcbd Mon Sep 17 00:00:00 2001 From: Jonny Silva Date: Wed, 8 Jan 2025 13:29:27 -0300 Subject: [PATCH] #2934 solution using autoref trick instead of blanket implementation for Option --- sqlx-core/src/from_row.rs | 12 ++++++++---- sqlx-macros-core/src/derives/row.rs | 2 -- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sqlx-core/src/from_row.rs b/sqlx-core/src/from_row.rs index 6181484d69..8dc5b8c7fa 100644 --- a/sqlx-core/src/from_row.rs +++ b/sqlx-core/src/from_row.rs @@ -1,3 +1,5 @@ +use std::marker::PhantomData; + use crate::{ error::{Error, UnexpectedNullError}, row::Row, @@ -491,13 +493,13 @@ impl_from_row_for_tuple!( (15) -> T16; ); -pub struct Wrapper; +pub struct Wrapper(pub PhantomData); pub trait FromOptRow<'r, R, T> { fn __from_row(&self, row: &'r R) -> Result; } -impl<'r, R, T> FromOptRow<'r, R, Option> for &Wrapper +impl<'r, R, T> FromOptRow<'r, R, Option> for Wrapper> where R: Row, T: FromRow<'r, R>, @@ -513,7 +515,7 @@ where } } -impl<'r, R, T> FromOptRow<'r, R, T> for Wrapper +impl<'r, R, T> FromOptRow<'r, R, T> for &Wrapper where R: Row, T: FromRow<'r, R>, @@ -527,8 +529,10 @@ where #[macro_export] macro_rules! __from_opt_row { ($t:ty, $row:expr) => {{ + use std::marker::PhantomData; use $crate::from_row::{FromOptRow, Wrapper}; - let value: Result<$t, sqlx::Error> = Wrapper.__from_row($row); + let wrapper = Wrapper(PhantomData::<$t>); + let value = (&wrapper).__from_row($row); value }}; } diff --git a/sqlx-macros-core/src/derives/row.rs b/sqlx-macros-core/src/derives/row.rs index 4ddc1f32af..8e1850d2f3 100644 --- a/sqlx-macros-core/src/derives/row.rs +++ b/sqlx-macros-core/src/derives/row.rs @@ -108,8 +108,6 @@ fn expand_derive_from_row_struct( } // Flatten (true, None, false) => { - predicates.push(parse_quote!(#ty: ::sqlx::FromRow<#lifetime, R>)); - //parse_quote!(<#ty as ::sqlx::FromRow<#lifetime, R>>::from_row(__row)) parse_quote!(::sqlx::__from_opt_row!(#ty, __row)) } // Flatten + Try from