sea_orm_codegen/entity/writer/
compact.rs1use super::*;
2
3impl EntityWriter {
4 #[allow(clippy::too_many_arguments)]
5 pub fn gen_compact_code_blocks(
6 entity: &Entity,
7 with_serde: &WithSerde,
8 column_option: &ColumnOption,
9 schema_name: &Option<String>,
10 serde_skip_deserializing_primary_key: bool,
11 serde_skip_hidden_column: bool,
12 model_extra_derives: &TokenStream,
13 model_extra_attributes: &TokenStream,
14 _column_extra_derives: &TokenStream,
15 seaography: bool,
16 impl_active_model_behavior: bool,
17 ) -> Vec<TokenStream> {
18 let mut imports = Self::gen_import(with_serde);
19 imports.extend(Self::gen_import_active_enum(entity));
20 let mut code_blocks = vec![
21 imports,
22 Self::gen_compact_model_struct(
23 entity,
24 with_serde,
25 column_option,
26 schema_name,
27 serde_skip_deserializing_primary_key,
28 serde_skip_hidden_column,
29 model_extra_derives,
30 model_extra_attributes,
31 ),
32 Self::gen_compact_relation_enum(entity),
33 ];
34 code_blocks.extend(Self::gen_impl_related(entity));
35 code_blocks.extend(Self::gen_impl_conjunct_related(entity));
36 if impl_active_model_behavior {
37 code_blocks.extend([Self::impl_active_model_behavior()]);
38 }
39 if seaography {
40 code_blocks.extend([Self::gen_related_entity(entity)]);
41 }
42 code_blocks
43 }
44
45 #[allow(clippy::too_many_arguments)]
46 pub fn gen_compact_model_struct(
47 entity: &Entity,
48 with_serde: &WithSerde,
49 column_option: &ColumnOption,
50 schema_name: &Option<String>,
51 serde_skip_deserializing_primary_key: bool,
52 serde_skip_hidden_column: bool,
53 model_extra_derives: &TokenStream,
54 model_extra_attributes: &TokenStream,
55 ) -> TokenStream {
56 let table_name = entity.table_name.as_str();
57 let column_names_snake_case = entity.get_column_names_snake_case();
58 let column_rs_types = entity.get_column_rs_types(column_option);
59 let if_eq_needed = entity.get_eq_needed();
60 let primary_keys: Vec<String> = entity
61 .primary_keys
62 .iter()
63 .map(|pk| pk.name.clone())
64 .collect();
65 let attrs: Vec<TokenStream> = entity
66 .columns
67 .iter()
68 .map(|col| {
69 let mut attrs: Punctuated<_, Comma> = Punctuated::new();
70 let is_primary_key = primary_keys.contains(&col.name);
71 if !col.is_snake_case_name() {
72 let column_name = &col.name;
73 attrs.push(quote! { column_name = #column_name });
74 }
75 if is_primary_key {
76 attrs.push(quote! { primary_key });
77 if !col.auto_increment {
78 attrs.push(quote! { auto_increment = false });
79 }
80 }
81 if let Some(ts) = col.get_col_type_attrs() {
82 attrs.extend([ts]);
83 if !col.not_null {
84 attrs.push(quote! { nullable });
85 }
86 };
87 if col.unique {
88 attrs.push(quote! { unique });
89 } else if let Some(unique_key) = &col.unique_key {
90 attrs.push(quote! { unique_key = #unique_key });
91 }
92 let mut ts = quote! {};
93 if !attrs.is_empty() {
94 for (i, attr) in attrs.into_iter().enumerate() {
95 if i > 0 {
96 ts = quote! { #ts, };
97 }
98 ts = quote! { #ts #attr };
99 }
100 ts = quote! { #[sea_orm(#ts)] };
101 }
102 let serde_attribute = col.get_serde_attribute(
103 is_primary_key,
104 serde_skip_deserializing_primary_key,
105 serde_skip_hidden_column,
106 );
107 ts = quote! {
108 #ts
109 #serde_attribute
110 };
111 ts
112 })
113 .collect();
114 let schema_name = match Self::gen_schema_name(schema_name) {
115 Some(schema_name) => quote! {
116 schema_name = #schema_name,
117 },
118 None => quote! {},
119 };
120 let extra_derive = with_serde.extra_derive();
121
122 quote! {
123 #[derive(Clone, Debug, PartialEq #if_eq_needed, DeriveEntityModel #extra_derive #model_extra_derives)]
124 #[sea_orm(
125 #schema_name
126 table_name = #table_name
127 )]
128 #model_extra_attributes
129 pub struct Model {
130 #(
131 #attrs
132 pub #column_names_snake_case: #column_rs_types,
133 )*
134 }
135 }
136 }
137
138 pub fn gen_compact_relation_enum(entity: &Entity) -> TokenStream {
139 let attrs = entity.get_relation_attrs();
140 let relation_enum_name = entity.get_relation_enum_name();
141 quote! {
142 #[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
143 pub enum Relation {
144 #(
145 #attrs
146 #relation_enum_name,
147 )*
148 }
149 }
150 }
151}