@@ -29,11 +29,9 @@ enum Error {
29
29
30
30
#[ derive( Debug , PartialEq , Eq ) ]
31
31
enum ColumnAs {
32
- /// column in the model
33
- Col ( syn:: Ident ) ,
34
32
/// alias from a column in model
35
33
ColAlias {
36
- col : syn:: Ident ,
34
+ col : Option < syn:: Ident > ,
37
35
field : syn:: Ident ,
38
36
} ,
39
37
/// from an expr
@@ -51,6 +49,7 @@ enum ColumnAs {
51
49
52
50
struct DerivePartialModel {
53
51
entity : Option < syn:: Type > ,
52
+ alias : Option < String > ,
54
53
ident : syn:: Ident ,
55
54
fields : Vec < ColumnAs > ,
56
55
from_query_result : bool ,
@@ -74,6 +73,7 @@ impl DerivePartialModel {
74
73
} ;
75
74
76
75
let mut entity = None ;
76
+ let mut alias = None ;
77
77
let mut from_query_result = false ;
78
78
79
79
for attr in input. attrs . iter ( ) {
@@ -85,6 +85,8 @@ impl DerivePartialModel {
85
85
for meta in list {
86
86
if let Some ( s) = meta. get_as_kv ( "entity" ) {
87
87
entity = Some ( syn:: parse_str :: < syn:: Type > ( & s) . map_err ( Error :: Syn ) ?) ;
88
+ } else if let Some ( s) = meta. get_as_kv ( "alias" ) {
89
+ alias = Some ( s) ;
88
90
} else if meta. exists ( "from_query_result" ) {
89
91
from_query_result = true ;
90
92
}
@@ -132,7 +134,7 @@ impl DerivePartialModel {
132
134
}
133
135
134
136
ColumnAs :: ColAlias {
135
- col,
137
+ col : Some ( col ) ,
136
138
field : field_name,
137
139
}
138
140
}
@@ -142,7 +144,7 @@ impl DerivePartialModel {
142
144
} ,
143
145
( None , None , true ) => ColumnAs :: Nested {
144
146
typ : field. ty ,
145
- field : field_name. unraw ( ) ,
147
+ field : field_name,
146
148
} ,
147
149
( None , None , false ) => {
148
150
if entity. is_none ( ) {
@@ -151,7 +153,10 @@ impl DerivePartialModel {
151
153
if skip {
152
154
ColumnAs :: Skip ( field_name)
153
155
} else {
154
- ColumnAs :: Col ( field_name)
156
+ ColumnAs :: ColAlias {
157
+ col : None ,
158
+ field : field_name,
159
+ }
155
160
}
156
161
}
157
162
( _, _, _) => return Err ( Error :: OverlappingAttributes ( field_span) ) ,
@@ -161,6 +166,7 @@ impl DerivePartialModel {
161
166
162
167
Ok ( Self {
163
168
entity,
169
+ alias,
164
170
ident : input. ident ,
165
171
fields : column_as_list,
166
172
from_query_result,
@@ -184,7 +190,6 @@ impl DerivePartialModel {
184
190
_ => FqrItemType :: Flat ,
185
191
} ,
186
192
ident : match col_as {
187
- ColumnAs :: Col ( field) => field,
188
193
ColumnAs :: ColAlias { field, .. } => field,
189
194
ColumnAs :: Expr { field, .. } => field,
190
195
ColumnAs :: Nested { field, .. } => field,
@@ -210,43 +215,36 @@ impl DerivePartialModel {
210
215
let select_ident = format_ident ! ( "select" ) ;
211
216
let DerivePartialModel {
212
217
entity,
218
+ alias,
213
219
ident,
214
220
fields,
215
221
..
216
222
} = self ;
217
223
let select_col_code_gen = fields. iter ( ) . map ( |col_as| match col_as {
218
- ColumnAs :: Col ( ident) => {
219
- let entity = entity. as_ref ( ) . unwrap ( ) ;
220
- let uppercase_ident = format_ident ! (
221
- "{}" ,
222
- ident. to_string( ) . to_upper_camel_case( )
223
- ) ;
224
- let col_value = quote ! ( <#entity as sea_orm:: EntityTrait >:: Column :: #uppercase_ident) ;
225
- let ident_stringified = ident. unraw ( ) . to_string ( ) ;
226
- quote ! ( let #select_ident =
227
- if let Some ( prefix) = pre {
228
- let ident = format!( "{prefix}{}" , #ident_stringified) ;
229
- sea_orm:: SelectColumns :: select_column_as( #select_ident, #col_value, ident)
230
- } else {
231
- sea_orm:: SelectColumns :: select_column_as( #select_ident, #col_value, #ident_stringified)
232
- } ;
233
- )
234
- } ,
235
224
ColumnAs :: ColAlias { col, field } => {
236
- let field = field. to_string ( ) ;
225
+ let field = field. unraw ( ) . to_string ( ) ;
237
226
let entity = entity. as_ref ( ) . unwrap ( ) ;
238
- let col_value = quote ! ( <#entity as sea_orm:: EntityTrait >:: Column :: #col) ;
227
+ let col_name = if let Some ( col) = col {
228
+ col
229
+ } else {
230
+ & format_ident ! ( "{}" , field. to_upper_camel_case( ) )
231
+ } ;
232
+ let col_value = if let Some ( alias) = alias {
233
+ quote ! ( Expr :: col( ( Alias :: new( #alias) , <#entity as sea_orm:: EntityTrait >:: Column :: #col_name) ) )
234
+ } else {
235
+ quote ! ( <#entity as sea_orm:: EntityTrait >:: Column :: #col_name)
236
+ } ;
239
237
quote ! ( let #select_ident =
240
- if let Some ( prefix) = pre {
241
- let ident = format!( "{prefix}{}" , #field) ;
242
- sea_orm:: SelectColumns :: select_column_as( #select_ident, #col_value, ident)
243
- } else {
244
- sea_orm:: SelectColumns :: select_column_as( #select_ident, #col_value, #field)
245
- } ;
238
+ if let Some ( prefix) = pre {
239
+ let ident = format!( "{prefix}{}" , #field) ;
240
+ sea_orm:: SelectColumns :: select_column_as( #select_ident, #col_value, ident)
241
+ } else {
242
+ sea_orm:: SelectColumns :: select_column_as( #select_ident, #col_value, #field)
243
+ } ;
246
244
)
247
- } ,
245
+ }
248
246
ColumnAs :: Expr { expr, field } => {
249
- let field = field. to_string ( ) ;
247
+ let field = field. unraw ( ) . to_string ( ) ;
250
248
quote ! ( let #select_ident =
251
249
if let Some ( prefix) = pre {
252
250
let ident = format!( "{prefix}{}" , #field) ;
@@ -255,19 +253,19 @@ impl DerivePartialModel {
255
253
sea_orm:: SelectColumns :: select_column_as( #select_ident, #expr, #field)
256
254
} ;
257
255
)
258
- } ,
256
+ }
259
257
ColumnAs :: Nested { typ, field } => {
260
- let field = field. to_string ( ) ;
258
+ let field = field. unraw ( ) . to_string ( ) ;
261
259
quote ! ( let #select_ident =
262
260
<#typ as sea_orm:: PartialModelTrait >:: select_cols_nested( #select_ident,
263
261
Some ( & if let Some ( prefix) = pre {
264
- format!( "{prefix}{}_" , #field) }
262
+ format!( "{prefix}{}_" , #field) }
265
263
else {
266
264
format!( "{}_" , #field)
267
265
}
268
266
) ) ;
269
267
)
270
- } ,
268
+ }
271
269
ColumnAs :: Skip ( _) => quote ! ( ) ,
272
270
} ) ;
273
271
0 commit comments