From 6a8e2ae42f53d674f0fcbd3c0a0dfbfe8698b055 Mon Sep 17 00:00:00 2001 From: Erik Rhodes Date: Thu, 24 Mar 2022 16:51:36 -0600 Subject: [PATCH 1/3] added copy derive for active enums --- sea-orm-codegen/src/entity/active_enum.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sea-orm-codegen/src/entity/active_enum.rs b/sea-orm-codegen/src/entity/active_enum.rs index 800da59e5..1780ef456 100644 --- a/sea-orm-codegen/src/entity/active_enum.rs +++ b/sea-orm-codegen/src/entity/active_enum.rs @@ -22,7 +22,7 @@ impl ActiveEnum { let extra_derive = with_serde.extra_derive(); quote! { - #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum #extra_derive)] + #[derive(Debug, Clone, Copy, PartialEq, EnumIter, DeriveActiveEnum #extra_derive)] #[sea_orm(rs_type = "String", db_type = "Enum", enum_name = #enum_name)] pub enum #enum_iden { #( From 85ef89c2d3dc1b8ffd3b35cceeb68b5e481be7d3 Mon Sep 17 00:00:00 2001 From: erhodes Date: Tue, 12 Jul 2022 10:49:09 -0600 Subject: [PATCH 2/3] added with-copy-enums flag to cli and conditional derive --- sea-orm-cli/src/cli.rs | 14 +++++++++++++- sea-orm-cli/src/commands.rs | 2 ++ sea-orm-codegen/src/entity/active_enum.rs | 9 +++++++-- sea-orm-codegen/src/entity/writer.rs | 9 ++++++--- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/sea-orm-cli/src/cli.rs b/sea-orm-cli/src/cli.rs index 4a918a628..15a57b14a 100644 --- a/sea-orm-cli/src/cli.rs +++ b/sea-orm-cli/src/cli.rs @@ -163,10 +163,22 @@ pub enum GenerateSubcommands { value_parser, long, default_value = "none", - help = "Automatically derive serde Serialize / Deserialize traits for the entity (none, serialize, deserialize, both)" + help = "Automatically derive serde Serialize / Deserialize traits for the entity (none,\ + serialize, deserialize, both)" )] with_serde: String, + #[clap( + action, + long, + default_value = "false", + long_help = "Automatically derive the Copy trait on generated enums.\n\ + Enums generated from a database don't have associated data by default, and as such can\ + derive Copy. + " + )] + with_copy_enums: bool, + #[clap( arg_enum, value_parser, diff --git a/sea-orm-cli/src/commands.rs b/sea-orm-cli/src/commands.rs index 70b13d010..c02e1e6f0 100644 --- a/sea-orm-cli/src/commands.rs +++ b/sea-orm-cli/src/commands.rs @@ -26,6 +26,7 @@ pub async fn run_generate_command( database_schema, database_url, with_serde, + with_copy_enums, date_time_crate, } => { if verbose { @@ -169,6 +170,7 @@ pub async fn run_generate_command( let writer_context = EntityWriterContext::new( expanded_format, WithSerde::from_str(&with_serde).unwrap(), + with_copy_enums, date_time_crate.into(), schema_name, ); diff --git a/sea-orm-codegen/src/entity/active_enum.rs b/sea-orm-codegen/src/entity/active_enum.rs index 6fb1a068f..72091fe99 100644 --- a/sea-orm-codegen/src/entity/active_enum.rs +++ b/sea-orm-codegen/src/entity/active_enum.rs @@ -10,7 +10,7 @@ pub struct ActiveEnum { } impl ActiveEnum { - pub fn impl_active_enum(&self, with_serde: &WithSerde) -> TokenStream { + pub fn impl_active_enum(&self, with_serde: &WithSerde, with_copy_enums: bool) -> TokenStream { let enum_name = &self.enum_name; let enum_iden = format_ident!("{}", enum_name.to_camel_case()); let values = &self.values; @@ -23,9 +23,14 @@ impl ActiveEnum { }); let extra_derive = with_serde.extra_derive(); + let copy_derive = if with_copy_enums { + quote! { , Copy } + } else { + quote! { } + }; quote! { - #[derive(Debug, Clone, Copy, PartialEq, EnumIter, DeriveActiveEnum #extra_derive)] + #[derive(Debug, Clone, PartialEq, EnumIter, DeriveActiveEnum #copy_derive #extra_derive)] #[sea_orm(rs_type = "String", db_type = "Enum", enum_name = #enum_name)] pub enum #enum_iden { #( diff --git a/sea-orm-codegen/src/entity/writer.rs b/sea-orm-codegen/src/entity/writer.rs index 4d9817a09..4949c4b65 100644 --- a/sea-orm-codegen/src/entity/writer.rs +++ b/sea-orm-codegen/src/entity/writer.rs @@ -39,6 +39,7 @@ pub enum DateTimeCrate { pub struct EntityWriterContext { pub(crate) expanded_format: bool, pub(crate) with_serde: WithSerde, + pub(crate) with_copy_enums: bool, pub(crate) date_time_crate: DateTimeCrate, pub(crate) schema_name: Option, } @@ -97,12 +98,14 @@ impl EntityWriterContext { pub fn new( expanded_format: bool, with_serde: WithSerde, + with_copy_enums: bool, date_time_crate: DateTimeCrate, schema_name: Option, ) -> Self { Self { expanded_format, with_serde, + with_copy_enums, date_time_crate, schema_name, } @@ -116,7 +119,7 @@ impl EntityWriter { files.push(self.write_mod()); files.push(self.write_prelude()); if !self.enums.is_empty() { - files.push(self.write_sea_orm_active_enums(&context.with_serde)); + files.push(self.write_sea_orm_active_enums(&context.with_serde, context.with_copy_enums)); } WriterOutput { files } } @@ -200,7 +203,7 @@ impl EntityWriter { } } - pub fn write_sea_orm_active_enums(&self, with_serde: &WithSerde) -> OutputFile { + pub fn write_sea_orm_active_enums(&self, with_serde: &WithSerde, with_copy_enums: bool) -> OutputFile { let mut lines = Vec::new(); Self::write_doc_comment(&mut lines); Self::write(&mut lines, vec![Self::gen_import(with_serde)]); @@ -208,7 +211,7 @@ impl EntityWriter { let code_blocks = self .enums .iter() - .map(|(_, active_enum)| active_enum.impl_active_enum(with_serde)) + .map(|(_, active_enum)| active_enum.impl_active_enum(with_serde, with_copy_enums)) .collect(); Self::write(&mut lines, code_blocks); OutputFile { From 08c36c30c9bafad78d007d5e52b9b77107ff79c6 Mon Sep 17 00:00:00 2001 From: erhodes Date: Tue, 12 Jul 2022 10:50:03 -0600 Subject: [PATCH 3/3] cargo fmt --- sea-orm-codegen/src/entity/active_enum.rs | 2 +- sea-orm-codegen/src/entity/writer.rs | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/sea-orm-codegen/src/entity/active_enum.rs b/sea-orm-codegen/src/entity/active_enum.rs index 72091fe99..d4a7e6003 100644 --- a/sea-orm-codegen/src/entity/active_enum.rs +++ b/sea-orm-codegen/src/entity/active_enum.rs @@ -26,7 +26,7 @@ impl ActiveEnum { let copy_derive = if with_copy_enums { quote! { , Copy } } else { - quote! { } + quote! {} }; quote! { diff --git a/sea-orm-codegen/src/entity/writer.rs b/sea-orm-codegen/src/entity/writer.rs index 4949c4b65..d90fdc515 100644 --- a/sea-orm-codegen/src/entity/writer.rs +++ b/sea-orm-codegen/src/entity/writer.rs @@ -119,7 +119,9 @@ impl EntityWriter { files.push(self.write_mod()); files.push(self.write_prelude()); if !self.enums.is_empty() { - files.push(self.write_sea_orm_active_enums(&context.with_serde, context.with_copy_enums)); + files.push( + self.write_sea_orm_active_enums(&context.with_serde, context.with_copy_enums), + ); } WriterOutput { files } } @@ -203,7 +205,11 @@ impl EntityWriter { } } - pub fn write_sea_orm_active_enums(&self, with_serde: &WithSerde, with_copy_enums: bool) -> OutputFile { + pub fn write_sea_orm_active_enums( + &self, + with_serde: &WithSerde, + with_copy_enums: bool, + ) -> OutputFile { let mut lines = Vec::new(); Self::write_doc_comment(&mut lines); Self::write(&mut lines, vec![Self::gen_import(with_serde)]);