@@ -14,35 +14,42 @@ use syn::{
14
14
pub fn expand_derive_type ( input : & DeriveInput ) -> syn:: Result < TokenStream > {
15
15
let attrs = parse_container_attributes ( & input. attrs ) ?;
16
16
match & input. data {
17
+ // Newtype structs:
18
+ // struct Foo(i32);
17
19
Data :: Struct ( DataStruct {
18
20
fields : Fields :: Unnamed ( FieldsUnnamed { unnamed, .. } ) ,
19
21
..
20
- } ) if unnamed. len ( ) == 1 => {
21
- expand_derive_has_sql_type_transparent ( input, unnamed. first ( ) . unwrap ( ) )
22
+ } ) => {
23
+ if unnamed. len ( ) == 1 {
24
+ expand_derive_has_sql_type_transparent ( input, unnamed. first ( ) . unwrap ( ) )
25
+ } else {
26
+ Err ( syn:: Error :: new_spanned (
27
+ input,
28
+ "structs with zero or more than one unnamed field are not supported" ,
29
+ ) )
30
+ }
22
31
}
23
- Data :: Enum ( DataEnum { variants, .. } ) => match attrs. repr {
24
- Some ( _) => expand_derive_has_sql_type_weak_enum ( input, variants) ,
25
- None => expand_derive_has_sql_type_strong_enum ( input, variants) ,
26
- } ,
32
+ // Record types
33
+ // struct Foo { foo: i32, bar: String }
27
34
Data :: Struct ( DataStruct {
28
35
fields : Fields :: Named ( FieldsNamed { named, .. } ) ,
29
36
..
30
37
} ) => expand_derive_has_sql_type_struct ( input, named) ,
31
- Data :: Union ( _) => Err ( syn:: Error :: new_spanned ( input, "unions are not supported" ) ) ,
32
- Data :: Struct ( DataStruct {
33
- fields : Fields :: Unnamed ( ..) ,
34
- ..
35
- } ) => Err ( syn:: Error :: new_spanned (
36
- input,
37
- "structs with zero or more than one unnamed field are not supported" ,
38
- ) ) ,
39
38
Data :: Struct ( DataStruct {
40
39
fields : Fields :: Unit ,
41
40
..
42
41
} ) => Err ( syn:: Error :: new_spanned (
43
42
input,
44
43
"unit structs are not supported" ,
45
44
) ) ,
45
+
46
+ Data :: Enum ( DataEnum { variants, .. } ) => match attrs. repr {
47
+ // Enums that encode to/from integers (weak enums)
48
+ Some ( _) => expand_derive_has_sql_type_weak_enum ( input, variants) ,
49
+ // Enums that decode to/from strings (strong enums)
50
+ None => expand_derive_has_sql_type_strong_enum ( input, variants) ,
51
+ } ,
52
+ Data :: Union ( _) => Err ( syn:: Error :: new_spanned ( input, "unions are not supported" ) ) ,
46
53
}
47
54
}
48
55
@@ -148,9 +155,10 @@ fn expand_derive_has_sql_type_weak_enum(
148
155
149
156
if cfg ! ( feature = "postgres" ) && !attrs. no_pg_array {
150
157
ts. extend ( quote ! (
158
+ #[ automatically_derived]
151
159
impl :: sqlx:: postgres:: PgHasArrayType for #ident {
152
160
fn array_type_info( ) -> :: sqlx:: postgres:: PgTypeInfo {
153
- <#ident as :: sqlx:: postgres:: PgHasArrayType >:: array_type_info( )
161
+ <#repr as :: sqlx:: postgres:: PgHasArrayType >:: array_type_info( )
154
162
}
155
163
}
156
164
) ) ;
@@ -197,9 +205,10 @@ fn expand_derive_has_sql_type_strong_enum(
197
205
198
206
if !attributes. no_pg_array {
199
207
tts. extend ( quote ! (
208
+ #[ automatically_derived]
200
209
impl :: sqlx:: postgres:: PgHasArrayType for #ident {
201
210
fn array_type_info( ) -> :: sqlx:: postgres:: PgTypeInfo {
202
- <#ident as :: sqlx:: postgres:: PgHasArrayType > :: array_type_info ( )
211
+ :: sqlx:: postgres:: PgTypeInfo :: array_of ( #ty_name )
203
212
}
204
213
}
205
214
) ) ;
@@ -244,6 +253,17 @@ fn expand_derive_has_sql_type_struct(
244
253
}
245
254
}
246
255
) ) ;
256
+
257
+ if !attributes. no_pg_array {
258
+ tts. extend ( quote ! (
259
+ #[ automatically_derived]
260
+ impl :: sqlx:: postgres:: PgHasArrayType for #ident {
261
+ fn array_type_info( ) -> :: sqlx:: postgres:: PgTypeInfo {
262
+ :: sqlx:: postgres:: PgTypeInfo :: array_of( #ty_name)
263
+ }
264
+ }
265
+ ) ) ;
266
+ }
247
267
}
248
268
249
269
Ok ( tts)
0 commit comments