Skip to content

Commit

Permalink
macro expands mostly correctly but need to figure out how to do trait…
Browse files Browse the repository at this point in the history
… bounds properly
  • Loading branch information
jonnyso committed Jan 7, 2025
1 parent 2003e26 commit 5ad8a4e
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 18 deletions.
58 changes: 42 additions & 16 deletions sqlx-core/src/from_row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -288,22 +288,6 @@ where
}
}

impl<'r, R, T> FromRow<'r, R> for Option<T>
where
R: Row,
T: FromRow<'r, R>,
{
fn from_row(row: &'r R) -> Result<Self, Error> {
let value = T::from_row(row).map(Some);
if let Err(Error::ColumnDecode { source, .. }) = value.as_ref() {
if let Some(UnexpectedNullError) = source.downcast_ref() {
return Ok(None);
}
}
value
}
}

// implement FromRow for tuples of types that implement Decode
// up to tuples of 9 values

Expand Down Expand Up @@ -506,3 +490,45 @@ impl_from_row_for_tuple!(
(14) -> T15;
(15) -> T16;
);

pub struct Wrapper;

pub trait FromOptRow<'r, R, T> {
fn __from_row(&self, row: &'r R) -> Result<T, Error>;
}

impl<'r, R, T> FromOptRow<'r, R, Option<T>> for &Wrapper
where
R: Row,
T: FromRow<'r, R>,
{
fn __from_row(&self, row: &'r R) -> Result<Option<T>, Error> {
let value = T::from_row(row).map(Some);
if let Err(Error::ColumnDecode { source, .. }) = value.as_ref() {
if let Some(UnexpectedNullError) = source.downcast_ref() {
return Ok(None);
}
}
value
}
}

impl<'r, R, T> FromOptRow<'r, R, T> for Wrapper
where
R: Row,
T: FromRow<'r, R>,
{
fn __from_row(&self, row: &'r R) -> Result<T, Error> {
T::from_row(row)
}
}

#[doc(hidden)]
#[macro_export]
macro_rules! __from_opt_row {
($t:ty, $row:expr) => {{
use $crate::from_row::{FromOptRow, Wrapper};
let value: Result<$t, sqlx::Error> = Wrapper.__from_row($row);
value
}};
}
3 changes: 2 additions & 1 deletion sqlx-macros-core/src/derives/row.rs
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,8 @@ 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!(<#ty as ::sqlx::FromRow<#lifetime, R>>::from_row(__row))
parse_quote!(::sqlx::__from_opt_row!(#ty, __row))
}
// Flatten + Try from
(true, Some(try_from), false) => {
Expand Down
3 changes: 2 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ pub use sqlx_core::connection::{ConnectOptions, Connection};
pub use sqlx_core::database::{self, Database};
pub use sqlx_core::describe::Describe;
pub use sqlx_core::executor::{Execute, Executor};
pub use sqlx_core::from_row::FromRow;
pub use sqlx_core::from_row::{FromRow, Wrapper, FromOptRow};
pub use sqlx_core::__from_opt_row;
pub use sqlx_core::pool::{self, Pool};
#[doc(hidden)]
pub use sqlx_core::query::query_with_result as __query_with_result;
Expand Down

0 comments on commit 5ad8a4e

Please sign in to comment.