Update without_id.rs

pull/3755/head
dullbananas 2023-08-01 19:44:24 -07:00 committed by GitHub
parent a364135e5a
commit e26107a2fe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 46 additions and 42 deletions

View File

@ -15,49 +15,53 @@
/// ///
/// The generated struct implements `Selectable` and `Queryable`. /// The generated struct implements `Selectable` and `Queryable`.
macro_rules! WithoutId { macro_rules! WithoutId {
( (
#[diesel(table_name = $table_name:ident)] #[diesel(table_name = $table_name:ident)]
$(#[$_struct_meta:meta])* $(#[$_struct_meta:meta])*
$vis:vis struct $struct_name:ident { $vis:vis struct $struct_name:ident {
$(#[$_id_meta:meta])* $(#[$_id_meta:meta])*
$_id_vis:vis id: $id_type:ty, $_id_vis:vis id: $id_type:ty,
$( $(
$(#[$_field_meta:meta])* // TODO: more flexible attribute matching
$field_vis:vis $field_name:ident : $field_type:ty, $(#[doc = $_doc1:tt])*
)* $(#[cfg($($cfgtt:tt)*)])*
$(#[cfg_attr($($cfgattrtt:tt)*)])*
$(#[serde($($serdett:tt)*)])*
$(#[doc = $_doc2:tt])*
$field_vis:vis $field_name:ident : $field_type:ty,
)*
}
) => {
::paste::paste! {
// TODO: remove serde derives
#[derive(::diesel::Queryable, ::diesel::Selectable, ::serde::Serialize, ::serde::Deserialize)]
#[diesel(table_name = $table_name)]
$vis struct [<$struct_name WithoutId>] {
$(
$(#[cfg($($cfgtt)*)])*
$field_vis $field_name : $field_type,
)*
}
impl [<$struct_name WithoutId>] {
pub fn into_full(self, id: $id_type) -> $struct_name {
$struct_name {
id,
$($(#[cfg($($cfgtt)*)])* $field_name : self.$field_name,)*
}
} }
) => { }
::paste::paste! { }
#[derive(::diesel::Queryable, ::diesel::Selectable)] };
#[diesel(table_name = $table_name)]
$vis struct [<$struct_name WithoutId>] {
$(
// Field attributes are not kept because either they are for other
// derive macros, or they are `#[cfg(...)]` which is evaluated before
// macro expansion.
$field_vis $field_name : $field_type,
)*
}
impl [<$struct_name WithoutId>] { // Keep on removing the first attribute until `diesel(table_name = ...)` becomes
pub fn into_full(self, id: $id_type) -> $struct_name { // the first, which will cause the first pattern to be matched.
$struct_name { (#[$_meta:meta] $($remaining:tt)*) => {
$($field_name : self.$field_name,)* WithoutId!($($remaining)*);
id, };
}
}
}
}
};
// Keep on removing the first attribute until `diesel(table_name = ...)` becomes // This pattern is matched when there's no attributes.
// the first, which will cause the first pattern to be matched. ($_vis:vis struct $($_tt:tt)*) => {
(#[$_meta:meta] $($remaining:tt)*) => { ::std::compile_error!("`#[diesel(table_name = ...)]` is missing");
WithoutId!($($remaining)*); };
};
// This pattern is matched when there's no attributes.
($_vis:vis struct $($_tt:tt)*) => {
::std::compile_error!("`#[diesel(table_name = ...)]` is missing");
};
} }