@@ -11,46 +11,73 @@ use crate::overrides::Overrides;
11
11
pub fn expand_derive_tosql ( input : DeriveInput ) -> Result < TokenStream , Error > {
12
12
let overrides = Overrides :: extract ( & input. attrs ) ?;
13
13
14
+ if overrides. name . is_some ( ) && overrides. transparent {
15
+ return Err ( Error :: new_spanned (
16
+ & input,
17
+ "#[postgres(transparent)] is not allowed with #[postgres(name = \" ...\" )]" ,
18
+ ) ) ;
19
+ }
20
+
14
21
let name = overrides. name . unwrap_or_else ( || input. ident . to_string ( ) ) ;
15
22
16
- let ( accepts_body, to_sql_body) = match input. data {
17
- Data :: Enum ( ref data) => {
18
- let variants = data
19
- . variants
20
- . iter ( )
21
- . map ( Variant :: parse)
22
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
23
- (
24
- accepts:: enum_body ( & name, & variants) ,
25
- enum_body ( & input. ident , & variants) ,
26
- )
27
- }
28
- Data :: Struct ( DataStruct {
29
- fields : Fields :: Unnamed ( ref fields) ,
30
- ..
31
- } ) if fields. unnamed . len ( ) == 1 => {
32
- let field = fields. unnamed . first ( ) . unwrap ( ) ;
33
- ( accepts:: domain_body ( & name, field) , domain_body ( ) )
34
- }
35
- Data :: Struct ( DataStruct {
36
- fields : Fields :: Named ( ref fields) ,
37
- ..
38
- } ) => {
39
- let fields = fields
40
- . named
41
- . iter ( )
42
- . map ( Field :: parse)
43
- . collect :: < Result < Vec < _ > , _ > > ( ) ?;
44
- (
45
- accepts:: composite_body ( & name, "ToSql" , & fields) ,
46
- composite_body ( & fields) ,
47
- )
23
+ let ( accepts_body, to_sql_body) = if overrides. transparent {
24
+ match input. data {
25
+ Data :: Struct ( DataStruct {
26
+ fields : Fields :: Unnamed ( ref fields) ,
27
+ ..
28
+ } ) if fields. unnamed . len ( ) == 1 => {
29
+ let field = fields. unnamed . first ( ) . unwrap ( ) ;
30
+
31
+ ( accepts:: transparent_body ( field) , transparent_body ( ) )
32
+ }
33
+ _ => {
34
+ return Err ( Error :: new_spanned (
35
+ input,
36
+ "#[postgres(transparent)] may only be applied to single field tuple structs" ,
37
+ ) ) ;
38
+ }
48
39
}
49
- _ => {
50
- return Err ( Error :: new_spanned (
51
- input,
52
- "#[derive(ToSql)] may only be applied to structs, single field tuple structs, and enums" ,
53
- ) ) ;
40
+ } else {
41
+ match input. data {
42
+ Data :: Enum ( ref data) => {
43
+ let variants = data
44
+ . variants
45
+ . iter ( )
46
+ . map ( Variant :: parse)
47
+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
48
+ (
49
+ accepts:: enum_body ( & name, & variants) ,
50
+ enum_body ( & input. ident , & variants) ,
51
+ )
52
+ }
53
+ Data :: Struct ( DataStruct {
54
+ fields : Fields :: Unnamed ( ref fields) ,
55
+ ..
56
+ } ) if fields. unnamed . len ( ) == 1 => {
57
+ let field = fields. unnamed . first ( ) . unwrap ( ) ;
58
+
59
+ ( accepts:: domain_body ( & name, field) , domain_body ( ) )
60
+ }
61
+ Data :: Struct ( DataStruct {
62
+ fields : Fields :: Named ( ref fields) ,
63
+ ..
64
+ } ) => {
65
+ let fields = fields
66
+ . named
67
+ . iter ( )
68
+ . map ( Field :: parse)
69
+ . collect :: < Result < Vec < _ > , _ > > ( ) ?;
70
+ (
71
+ accepts:: composite_body ( & name, "ToSql" , & fields) ,
72
+ composite_body ( & fields) ,
73
+ )
74
+ }
75
+ _ => {
76
+ return Err ( Error :: new_spanned (
77
+ input,
78
+ "#[derive(ToSql)] may only be applied to structs, single field tuple structs, and enums" ,
79
+ ) ) ;
80
+ }
54
81
}
55
82
} ;
56
83
@@ -78,6 +105,12 @@ pub fn expand_derive_tosql(input: DeriveInput) -> Result<TokenStream, Error> {
78
105
Ok ( out)
79
106
}
80
107
108
+ fn transparent_body ( ) -> TokenStream {
109
+ quote ! {
110
+ postgres_types:: ToSql :: to_sql( & self . 0 , _type, buf)
111
+ }
112
+ }
113
+
81
114
fn enum_body ( ident : & Ident , variants : & [ Variant ] ) -> TokenStream {
82
115
let idents = iter:: repeat ( ident) ;
83
116
let variant_idents = variants. iter ( ) . map ( |v| & v. ident ) ;
0 commit comments