sea_orm_codegen/entity/writer/
compact.rs

1use 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}