From 6a26b8cc1773aa8765b9b8ff0275bd809666c7f7 Mon Sep 17 00:00:00 2001 From: Chris Tsang Date: Thu, 3 Jun 2021 13:07:35 +0800 Subject: [PATCH] ActiveModelBehavior --- sea-orm-macros/src/derives/active_model.rs | 14 +++++++++++++- src/entity/active_model.rs | 12 +++++++++++- src/entity/prelude.rs | 8 ++++---- src/tests_cfg/cake.rs | 4 ++++ src/tests_cfg/cake_filling.rs | 4 ++++ src/tests_cfg/filling.rs | 4 ++++ src/tests_cfg/fruit.rs | 4 ++++ 7 files changed, 44 insertions(+), 6 deletions(-) diff --git a/sea-orm-macros/src/derives/active_model.rs b/sea-orm-macros/src/derives/active_model.rs index 30ca937f..4a394623 100644 --- a/sea-orm-macros/src/derives/active_model.rs +++ b/sea-orm-macros/src/derives/active_model.rs @@ -31,11 +31,17 @@ pub fn expand_derive_active_model(ident: Ident, data: Data) -> syn::Result = fields.into_iter().map(|Field { ty, .. }| ty).collect(); Ok(quote!( - #[derive(Clone, Debug, Default)] + #[derive(Clone, Debug)] pub struct ActiveModel { #(pub #field: sea_orm::ActiveValue<#ty>),* } + impl Default for ActiveModel { + fn default() -> Self { + ::new() + } + } + impl From<#ident> for ActiveModel { fn from(m: #ident) -> Self { Self { @@ -70,6 +76,12 @@ pub fn expand_derive_active_model(ident: Ident, data: Data) -> syn::Result::Column::#name => self.#field = sea_orm::ActiveValue::unset()),* } } + + fn default() -> Self { + Self { + #(#field: sea_orm::ActiveValue::unset()),* + } + } } )) } diff --git a/src/entity/active_model.rs b/src/entity/active_model.rs index 953f0384..2f7ae3d9 100644 --- a/src/entity/active_model.rs +++ b/src/entity/active_model.rs @@ -44,7 +44,7 @@ where ActiveValue::unchanged(value) } -pub trait ActiveModelTrait: Clone + Debug + Default { +pub trait ActiveModelTrait: Clone + Debug { type Entity: EntityTrait; fn take(&mut self, c: ::Column) -> ActiveValue; @@ -54,6 +54,16 @@ pub trait ActiveModelTrait: Clone + Debug + Default { fn set(&mut self, c: ::Column, v: Value); fn unset(&mut self, c: ::Column); + + fn default() -> Self; +} + +pub trait ActiveModelBehavior: ActiveModelTrait { + type Entity: EntityTrait; + + fn new() -> Self { + ::default() + } } impl ActiveValue diff --git a/src/entity/prelude.rs b/src/entity/prelude.rs index 1edc6508..62d82027 100644 --- a/src/entity/prelude.rs +++ b/src/entity/prelude.rs @@ -1,6 +1,6 @@ pub use crate::{ - ActiveModelTrait, ColumnTrait, ColumnType, DeriveActiveModel, DeriveColumn, DeriveEntity, - DeriveModel, DerivePrimaryKey, EntityName, EntityTrait, EnumIter, Iden, IdenStatic, ModelTrait, - PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, QueryResult, Related, RelationDef, - RelationTrait, Select, TypeErr, Value, + ActiveModelBehavior, ActiveModelTrait, ColumnTrait, ColumnType, DeriveActiveModel, + DeriveColumn, DeriveEntity, DeriveModel, DerivePrimaryKey, EntityName, EntityTrait, EnumIter, + Iden, IdenStatic, ModelTrait, PrimaryKeyToColumn, PrimaryKeyTrait, QueryFilter, QueryResult, + Related, RelationDef, RelationTrait, Select, TypeErr, Value, }; diff --git a/src/tests_cfg/cake.rs b/src/tests_cfg/cake.rs index 7c5b2b1d..6b17e1b3 100644 --- a/src/tests_cfg/cake.rs +++ b/src/tests_cfg/cake.rs @@ -74,3 +74,7 @@ impl Model { Entity::find_related().belongs_to::(self) } } + +impl ActiveModelBehavior for ActiveModel { + type Entity = Entity; +} diff --git a/src/tests_cfg/cake_filling.rs b/src/tests_cfg/cake_filling.rs index 93db9cd9..1837d6c8 100644 --- a/src/tests_cfg/cake_filling.rs +++ b/src/tests_cfg/cake_filling.rs @@ -54,3 +54,7 @@ impl RelationTrait for Relation { } } } + +impl ActiveModelBehavior for ActiveModel { + type Entity = Entity; +} diff --git a/src/tests_cfg/filling.rs b/src/tests_cfg/filling.rs index 673e62ee..856598d5 100644 --- a/src/tests_cfg/filling.rs +++ b/src/tests_cfg/filling.rs @@ -57,3 +57,7 @@ impl Model { Entity::find_related().belongs_to::(self) } } + +impl ActiveModelBehavior for ActiveModel { + type Entity = Entity; +} diff --git a/src/tests_cfg/fruit.rs b/src/tests_cfg/fruit.rs index b852d2f6..c99433c2 100644 --- a/src/tests_cfg/fruit.rs +++ b/src/tests_cfg/fruit.rs @@ -44,3 +44,7 @@ impl RelationTrait for Relation { panic!() } } + +impl ActiveModelBehavior for ActiveModel { + type Entity = Entity; +}