diff --git a/src/lib.rs b/src/lib.rs index 2c0399f..c572ebb 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,6 +30,11 @@ pub fn db_type(attr: TokenStream, item: TokenStream) -> TokenStream { .into(); }; + let has_id_field = fields.named.iter().any(|field| + field.ident.as_ref() + .map_or(false, |field| field == "id") + ); + // Filter out fields with the `#[omit_new]` attribute let new_fields = fields.named.iter().filter(|field| { !field @@ -89,12 +94,23 @@ pub fn db_type(attr: TokenStream, item: TokenStream) -> TokenStream { // Get the table path from the attribute let table_path = parse_macro_input!(attr as Path); - // Generate the expanded code - let expanded = quote! { - #[cfg_attr(feature = "ssr", derive( + // Don't include the Identifiable derive for structs without an `id` field + let full_type_derives = if has_id_field { + quote! { diesel::prelude::Queryable, diesel::prelude::Selectable, - diesel::prelude::Identifiable))] + diesel::prelude::Identifiable + } + } else { + quote! { + diesel::prelude::Queryable, + diesel::prelude::Selectable + } + }; + + // Generate the expanded code + let expanded = quote! { + #[cfg_attr(feature = "ssr", derive(#full_type_derives))] #[cfg_attr(feature = "ssr", diesel(check_for_backend(diesel::pg::Pg)))] #[cfg_attr(feature = "ssr", diesel(table_name = #table_path))] #clean_derive_input