From 58b78550137f5132e6d8ef9f57b4b2cbb28a8810 Mon Sep 17 00:00:00 2001 From: Edoardo Morandi Date: Tue, 10 Jun 2025 15:42:37 +0200 Subject: [PATCH 1/3] fix: reference to crates from macro In this way the macro works even if one of the crates is renamed to something else in the project that is using benzina. --- benzina/src/__private/mod.rs | 5 ++ benzina/src/__private/typed_uuid.rs | 6 ++ benzina/src/lib.rs | 2 + benzina/src/typed_uuid.rs | 107 ++++++++++++++-------------- 4 files changed, 68 insertions(+), 52 deletions(-) create mode 100644 benzina/src/__private/mod.rs create mode 100644 benzina/src/__private/typed_uuid.rs diff --git a/benzina/src/__private/mod.rs b/benzina/src/__private/mod.rs new file mode 100644 index 0000000..29245df --- /dev/null +++ b/benzina/src/__private/mod.rs @@ -0,0 +1,5 @@ +#[cfg(feature = "typed-uuid")] +mod typed_uuid; + +#[cfg(feature = "typed-uuid")] +pub use typed_uuid::*; diff --git a/benzina/src/__private/typed_uuid.rs b/benzina/src/__private/typed_uuid.rs new file mode 100644 index 0000000..1d36f2a --- /dev/null +++ b/benzina/src/__private/typed_uuid.rs @@ -0,0 +1,6 @@ +pub use ::diesel; +pub use ::std; +pub use ::uuid; + +#[cfg(feature = "serde")] +pub use ::serde; diff --git a/benzina/src/lib.rs b/benzina/src/lib.rs index de327d4..deaf5b1 100644 --- a/benzina/src/lib.rs +++ b/benzina/src/lib.rs @@ -5,6 +5,8 @@ pub use self::int::{U15, U31, U63}; #[cfg(feature = "derive")] pub use benzina_derive::Enum; +#[doc(hidden)] +pub mod __private; #[cfg(feature = "postgres")] pub mod error; #[cfg(feature = "example-generated")] diff --git a/benzina/src/typed_uuid.rs b/benzina/src/typed_uuid.rs index 26e2db4..de6938c 100644 --- a/benzina/src/typed_uuid.rs +++ b/benzina/src/typed_uuid.rs @@ -73,83 +73,83 @@ macro_rules! typed_uuid { $( $(#[$attr])* #[derive( - ::std::fmt::Debug, - ::std::clone::Clone, - ::std::marker::Copy, - ::std::cmp::PartialEq, - ::std::cmp::Eq, - ::std::cmp::PartialOrd, - ::std::cmp::Ord, - ::std::hash::Hash, - ::diesel::expression::AsExpression, - ::diesel::deserialize::FromSqlRow, + $crate::__private::std::fmt::Debug, + $crate::__private::std::clone::Clone, + $crate::__private::std::marker::Copy, + $crate::__private::std::cmp::PartialEq, + $crate::__private::std::cmp::Eq, + $crate::__private::std::cmp::PartialOrd, + $crate::__private::std::cmp::Ord, + $crate::__private::std::hash::Hash, + $crate::__private::diesel::expression::AsExpression, + $crate::__private::diesel::deserialize::FromSqlRow, )] - #[diesel(sql_type = ::diesel::pg::sql_types::Uuid)] - $vis struct $name(::uuid::Uuid); + #[diesel(sql_type = $crate::__private::diesel::pg::sql_types::Uuid)] + $vis struct $name($crate::__private::uuid::Uuid); impl $name { /// Gets the actual [`Uuid`]. /// - /// [`Uuid`]: ::uuid::Uuid + /// [`Uuid`]: $crate::__private::uuid::Uuid #[must_use] - pub fn get(&self) -> ::uuid::Uuid { + pub fn get(&self) -> $crate::__private::uuid::Uuid { self.0 } } - impl ::diesel::deserialize::FromSql<::diesel::pg::sql_types::Uuid, ::diesel::pg::Pg> for $name { - fn from_sql(value: ::diesel::pg::PgValue<'_>) -> ::diesel::deserialize::Result { - uuid::Uuid::from_slice(value.as_bytes()) + impl $crate::__private::diesel::deserialize::FromSql<$crate::__private::diesel::pg::sql_types::Uuid, $crate::__private::diesel::pg::Pg> for $name { + fn from_sql(value: $crate::__private::diesel::pg::PgValue<'_>) -> $crate::__private::diesel::deserialize::Result { + $crate::__private::uuid::Uuid::from_slice(value.as_bytes()) .map(Self) .map_err(Into::into) } } - impl ::diesel::serialize::ToSql<::diesel::pg::sql_types::Uuid, ::diesel::pg::Pg> for $name { - fn to_sql<'b>(&'b self, out: &mut ::diesel::serialize::Output<'b, '_, ::diesel::pg::Pg>) -> ::diesel::serialize::Result { - ::std::io::Write::write_all(out, self.0.as_bytes()) - .map(|_| ::diesel::serialize::IsNull::No) + impl $crate::__private::diesel::serialize::ToSql<$crate::__private::diesel::pg::sql_types::Uuid, $crate::__private::diesel::pg::Pg> for $name { + fn to_sql<'b>(&'b self, out: &mut $crate::__private::diesel::serialize::Output<'b, '_, $crate::__private::diesel::pg::Pg>) -> $crate::__private::diesel::serialize::Result { + $crate::__private::std::io::Write::write_all(out, self.0.as_bytes()) + .map(|_| $crate::__private::diesel::serialize::IsNull::No) .map_err(Into::into) } } - impl ::std::cmp::PartialEq<::uuid::Uuid> for $name { - fn eq(&self, other: &::uuid::Uuid) -> bool { + impl $crate::__private::std::cmp::PartialEq<$crate::__private::uuid::Uuid> for $name { + fn eq(&self, other: &$crate::__private::uuid::Uuid) -> bool { self.0 == *other } } - impl ::std::cmp::PartialEq<$name> for ::uuid::Uuid { + impl $crate::__private::std::cmp::PartialEq<$name> for $crate::__private::uuid::Uuid { fn eq(&self, other: &$name) -> bool { *self == other.0 } } - impl ::std::cmp::PartialEq<::uuid::NonNilUuid> for $name { - fn eq(&self, other: &::uuid::NonNilUuid) -> bool { + impl $crate::__private::std::cmp::PartialEq<$crate::__private::uuid::NonNilUuid> for $name { + fn eq(&self, other: &$crate::__private::uuid::NonNilUuid) -> bool { self.0 == *other } } - impl ::std::cmp::PartialEq<$name> for ::uuid::NonNilUuid { + impl $crate::__private::std::cmp::PartialEq<$name> for $crate::__private::uuid::NonNilUuid { fn eq(&self, other: &$name) -> bool { *self == other.0 } } - impl ::std::convert::AsRef<[u8]> for $name { + impl $crate::__private::std::convert::AsRef<[u8]> for $name { fn as_ref(&self) -> &[u8] { - ::std::convert::AsRef::as_ref(&self.0) + $crate::__private::std::convert::AsRef::as_ref(&self.0) } } - impl ::std::convert::AsRef<::uuid::Uuid> for $name { - fn as_ref(&self) -> &::uuid::Uuid { + impl $crate::__private::std::convert::AsRef<$crate::__private::uuid::Uuid> for $name { + fn as_ref(&self) -> &$crate::__private::uuid::Uuid { &self.0 } } - impl ::std::convert::From<$name> for ::uuid::Uuid { + impl $crate::__private::std::convert::From<$name> for $crate::__private::uuid::Uuid { fn from(value: $name) -> Self { value.0 } @@ -157,29 +157,29 @@ macro_rules! typed_uuid { $crate::__typed_uuid__forward_from!( $name: - ::uuid::fmt::Braced, - ::uuid::fmt::Hyphenated, - ::uuid::fmt::Simple, - ::uuid::fmt::Urn, - ::std::string::String, - ::std::vec::Vec, + $crate::__private::uuid::fmt::Braced, + $crate::__private::uuid::fmt::Hyphenated, + $crate::__private::uuid::fmt::Simple, + $crate::__private::uuid::fmt::Urn, + $crate::__private::std::string::String, + $crate::__private::std::vec::Vec, ); - impl ::std::fmt::Display for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::std::fmt::Display::fmt(&self.0, f) + impl $crate::__private::std::fmt::Display for $name { + fn fmt(&self, f: &mut $crate::__private::std::fmt::Formatter<'_>) -> $crate::__private::std::fmt::Result { + $crate::__private::std::fmt::Display::fmt(&self.0, f) } } - impl ::std::fmt::LowerHex for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::std::fmt::LowerHex::fmt(&self.0, f) + impl $crate::__private::std::fmt::LowerHex for $name { + fn fmt(&self, f: &mut $crate::__private::std::fmt::Formatter<'_>) -> $crate::__private::std::fmt::Result { + $crate::__private::std::fmt::LowerHex::fmt(&self.0, f) } } - impl ::std::fmt::UpperHex for $name { - fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { - ::std::fmt::UpperHex::fmt(&self.0, f) + impl $crate::__private::std::fmt::UpperHex for $name { + fn fmt(&self, f: &mut $crate::__private::std::fmt::Formatter<'_>) -> $crate::__private::std::fmt::Result { + $crate::__private::std::fmt::UpperHex::fmt(&self.0, f) } } @@ -193,7 +193,7 @@ macro_rules! typed_uuid { macro_rules! __typed_uuid__forward_from { ($name:ident: $($ty:path),+ $(,)?) => { $( - impl ::std::convert::From<$name> for $ty { + impl $crate::__private::std::convert::From<$name> for $ty { fn from(value: $name) -> Self { Self::from(value.0) } @@ -207,12 +207,15 @@ macro_rules! __typed_uuid__forward_from { #[cfg(feature = "serde")] macro_rules! __typed_uuid__impl_serde { ($name:ident) => { - impl ::serde::Serialize for $name { - fn serialize(&self, serializer: S) -> ::std::result::Result + impl $crate::__private::serde::Serialize for $name { + fn serialize( + &self, + serializer: S, + ) -> $crate::__private::std::result::Result where - S: ::serde::Serializer, + S: $crate::__private::serde::Serializer, { - ::serde::Serialize::serialize(&self.0, serializer) + $crate::__private::serde::Serialize::serialize(&self.0, serializer) } } }; From f14106c4558e43b83bfdd528746c29ccf9216b5f Mon Sep 17 00:00:00 2001 From: Edoardo Morandi Date: Tue, 10 Jun 2025 16:16:05 +0200 Subject: [PATCH 2/3] fix: manually impl diesel traits We discovered that the derive macros of diesel tries to use the `diesel` crate name, which could have been omitted or renamed. Manually implementing the traits we can use our private path. --- benzina/src/typed_uuid.rs | 140 +++++++++++++++++++++++++++++++++++++- 1 file changed, 137 insertions(+), 3 deletions(-) diff --git a/benzina/src/typed_uuid.rs b/benzina/src/typed_uuid.rs index de6938c..47870f8 100644 --- a/benzina/src/typed_uuid.rs +++ b/benzina/src/typed_uuid.rs @@ -81,10 +81,7 @@ macro_rules! typed_uuid { $crate::__private::std::cmp::PartialOrd, $crate::__private::std::cmp::Ord, $crate::__private::std::hash::Hash, - $crate::__private::diesel::expression::AsExpression, - $crate::__private::diesel::deserialize::FromSqlRow, )] - #[diesel(sql_type = $crate::__private::diesel::pg::sql_types::Uuid)] $vis struct $name($crate::__private::uuid::Uuid); impl $name { @@ -113,6 +110,143 @@ macro_rules! typed_uuid { } } + // These are manually implemented because the derive macro uses `diesel` instead of the + // private path. + impl< + '__expr, + > $crate::__private::diesel::expression::AsExpression<$crate::__private::diesel::pg::sql_types::Uuid> + for &'__expr $name { + type Expression = $crate::__private::diesel::internal::derives::as_expression::Bound< + $crate::__private::diesel::pg::sql_types::Uuid, + Self, + >; + fn as_expression( + self, + ) -> >::Expression { + $crate::__private::diesel::internal::derives::as_expression::Bound::new(self) + } + } + impl< + '__expr, + > $crate::__private::diesel::expression::AsExpression< + $crate::__private::diesel::sql_types::Nullable<$crate::__private::diesel::pg::sql_types::Uuid>, + > for &'__expr $name { + type Expression = $crate::__private::diesel::internal::derives::as_expression::Bound< + $crate::__private::diesel::sql_types::Nullable< + $crate::__private::diesel::pg::sql_types::Uuid, + >, + Self, + >; + fn as_expression( + self, + ) -> , + >>::Expression { + $crate::__private::diesel::internal::derives::as_expression::Bound::new(self) + } + } + impl< + '__expr, + '__expr2, + > $crate::__private::diesel::expression::AsExpression<$crate::__private::diesel::pg::sql_types::Uuid> + for &'__expr2 &'__expr $name { + type Expression = $crate::__private::diesel::internal::derives::as_expression::Bound< + $crate::__private::diesel::pg::sql_types::Uuid, + Self, + >; + fn as_expression( + self, + ) -> >::Expression { + $crate::__private::diesel::internal::derives::as_expression::Bound::new(self) + } + } + impl< + '__expr, + '__expr2, + > $crate::__private::diesel::expression::AsExpression< + $crate::__private::diesel::sql_types::Nullable<$crate::__private::diesel::pg::sql_types::Uuid>, + > for &'__expr2 &'__expr $name { + type Expression = $crate::__private::diesel::internal::derives::as_expression::Bound< + $crate::__private::diesel::sql_types::Nullable< + $crate::__private::diesel::pg::sql_types::Uuid, + >, + Self, + >; + fn as_expression( + self, + ) -> , + >>::Expression { + $crate::__private::diesel::internal::derives::as_expression::Bound::new(self) + } + } + impl< + __DB, + > $crate::__private::diesel::serialize::ToSql< + $crate::__private::diesel::sql_types::Nullable<$crate::__private::diesel::pg::sql_types::Uuid>, + __DB, + > for $name + where + __DB: $crate::__private::diesel::backend::Backend, + Self: $crate::__private::diesel::serialize::ToSql< + $crate::__private::diesel::pg::sql_types::Uuid, + __DB, + >, + { + fn to_sql<'__b>( + &'__b self, + out: &mut $crate::__private::diesel::serialize::Output<'__b, '_, __DB>, + ) -> $crate::__private::diesel::serialize::Result { + $crate::__private::diesel::serialize::ToSql::< + $crate::__private::diesel::pg::sql_types::Uuid, + __DB, + >::to_sql(self, out) + } + } + impl $crate::__private::diesel::expression::AsExpression< + $crate::__private::diesel::pg::sql_types::Uuid, + > for $name { + type Expression = $crate::__private::diesel::internal::derives::as_expression::Bound< + $crate::__private::diesel::pg::sql_types::Uuid, + Self, + >; + fn as_expression( + self, + ) -> >::Expression { + $crate::__private::diesel::internal::derives::as_expression::Bound::new(self) + } + } + impl $crate::__private::diesel::expression::AsExpression< + $crate::__private::diesel::sql_types::Nullable<$crate::__private::diesel::pg::sql_types::Uuid>, + > for $name { + type Expression = $crate::__private::diesel::internal::derives::as_expression::Bound< + $crate::__private::diesel::sql_types::Nullable< + $crate::__private::diesel::pg::sql_types::Uuid, + >, + Self, + >; + fn as_expression( + self, + ) -> , + >>::Expression { + $crate::__private::diesel::internal::derives::as_expression::Bound::new(self) + } + } + + impl $crate::__private::std::cmp::PartialEq<$crate::__private::uuid::Uuid> for $name { fn eq(&self, other: &$crate::__private::uuid::Uuid) -> bool { self.0 == *other From 75b3ecb2d868d3b0227da5ae32f8fe4eedeceafc Mon Sep 17 00:00:00 2001 From: Edoardo Morandi Date: Tue, 10 Jun 2025 16:18:33 +0200 Subject: [PATCH 3/3] style: minor formatting issue in typed_uuid macro --- benzina/src/typed_uuid.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benzina/src/typed_uuid.rs b/benzina/src/typed_uuid.rs index 47870f8..1df9600 100644 --- a/benzina/src/typed_uuid.rs +++ b/benzina/src/typed_uuid.rs @@ -318,7 +318,7 @@ macro_rules! typed_uuid { } $crate::__typed_uuid__impl_serde!($name); - )+ + )+ }; }