From ead131d937638a625501a4a2a589a0370745acd8 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Fri, 25 Oct 2024 12:04:35 +0200 Subject: [PATCH] Use input ident instead of associated type projections in ActiveModel derive (#2349) * Use input ident instead of associated type projections in ActiveModel derive * Add a test --- sea-orm-macros/src/derives/active_model.rs | 20 ++++++++++---------- tests/impl_from_for_active_model.rs | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 tests/impl_from_for_active_model.rs diff --git a/sea-orm-macros/src/derives/active_model.rs b/sea-orm-macros/src/derives/active_model.rs index 60cac7e4..2ad8348a 100644 --- a/sea-orm-macros/src/derives/active_model.rs +++ b/sea-orm-macros/src/derives/active_model.rs @@ -22,8 +22,8 @@ pub fn expand_derive_active_model(ident: Ident, data: Data) -> syn::Result syn::Result) -> syn::Result { +fn derive_active_model(ident: &Ident, all_fields: IntoIter) -> syn::Result { let fields = all_fields.filter(field_not_ignored); let field: Vec = fields.clone().map(format_field_ident).collect(); @@ -87,8 +87,8 @@ fn derive_active_model(all_fields: IntoIter) -> syn::Result } #[automatically_derived] - impl std::convert::From<::Model> for ActiveModel { - fn from(m: ::Model) -> Self { + impl std::convert::From<#ident> for ActiveModel { + fn from(m: #ident) -> Self { Self { #(#field: sea_orm::ActiveValue::unchanged(m.#field)),* } @@ -96,7 +96,7 @@ fn derive_active_model(all_fields: IntoIter) -> syn::Result } #[automatically_derived] - impl sea_orm::IntoActiveModel for ::Model { + impl sea_orm::IntoActiveModel for #ident { fn into_active_model(self) -> ActiveModel { self.into() } @@ -161,7 +161,7 @@ fn derive_active_model(all_fields: IntoIter) -> syn::Result )) } -fn derive_into_model(model_fields: IntoIter) -> syn::Result { +fn derive_into_model(ident: &Ident, model_fields: IntoIter) -> syn::Result { let active_model_fields = model_fields.clone().filter(field_not_ignored); let active_model_field: Vec = active_model_fields @@ -192,7 +192,7 @@ fn derive_into_model(model_fields: IntoIter) -> syn::Result Ok(quote!( #[automatically_derived] - impl std::convert::TryFrom for ::Model { + impl std::convert::TryFrom for #ident { type Error = sea_orm::DbErr; fn try_from(a: ActiveModel) -> Result { #(if matches!(a.#active_model_field, sea_orm::ActiveValue::NotSet) { @@ -207,8 +207,8 @@ fn derive_into_model(model_fields: IntoIter) -> syn::Result } #[automatically_derived] - impl sea_orm::TryIntoModel<::Model> for ActiveModel { - fn try_into_model(self) -> Result<::Model, sea_orm::DbErr> { + impl sea_orm::TryIntoModel<#ident> for ActiveModel { + fn try_into_model(self) -> Result<#ident, sea_orm::DbErr> { self.try_into() } } diff --git a/tests/impl_from_for_active_model.rs b/tests/impl_from_for_active_model.rs new file mode 100644 index 00000000..81dfaac9 --- /dev/null +++ b/tests/impl_from_for_active_model.rs @@ -0,0 +1,15 @@ +use sea_orm::{tests_cfg::cake, Set}; + +struct Cake { + id: i32, + name: String, +} + +impl From for cake::ActiveModel { + fn from(value: Cake) -> Self { + Self { + id: Set(value.id), + name: Set(value.name), + } + } +}