diff --git a/benzina-derive/src/join/utils.rs b/benzina-derive/src/join/utils.rs index c6e17b8..29905da 100644 --- a/benzina-derive/src/join/utils.rs +++ b/benzina-derive/src/join/utils.rs @@ -19,8 +19,8 @@ impl ToTokens for Identifiable { fn to_tokens(&self, tokens: &mut TokenStream) { let Self { table } = self; tokens.extend(quote! { - ::benzina::__private::std::clone::Clone::clone( - <_ as ::benzina::__private::diesel::associations::Identifiable>::id(&#table) + ::benzina::__private::deep_clone::DeepClone::deep_clone( + &(<_ as ::benzina::__private::diesel::associations::Identifiable>::id(&#table),) ) }); } diff --git a/benzina/src/__private.rs b/benzina/src/__private.rs index 2f440f1..908cbd8 100644 --- a/benzina/src/__private.rs +++ b/benzina/src/__private.rs @@ -22,3 +22,53 @@ pub type IndexMap = indexmap::IndexMap; pub fn new_indexmap() -> IndexMap { IndexMap::with_hasher(Hasher::default()) } + +pub mod deep_clone { + pub trait DeepClone { + type Output; + + fn deep_clone(&self) -> Self::Output; + } + + impl DeepClone for &T { + type Output = T; + + fn deep_clone(&self) -> Self::Output { + (*self).clone() + } + } + + #[rustfmt::skip] + mod impls { + use super::DeepClone; + + macro_rules! impl_deep_clone_for_tuples { + ($(($T:ident, $idx:tt)),+) => { + impl<$($T: DeepClone),+> DeepClone for ($($T),+,) { + type Output = ($(<$T as DeepClone>::Output),+,); + + fn deep_clone(&self) -> Self::Output { + ($((&self).$idx.deep_clone()),+,) + } + } + }; + } + + impl_deep_clone_for_tuples!((T1, 0)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12), (T14, 13)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12), (T14, 13), (T15, 14)); + impl_deep_clone_for_tuples!((T1, 0), (T2, 1), (T3, 2), (T4, 3), (T5, 4), (T6, 5), (T7, 6), (T8, 7), (T9, 8), (T10, 9), (T11, 10), (T12, 11), (T13, 12), (T14, 13), (T15, 14), (T16, 15)); + } +}