1
1
use proc_macro2:: { Ident , Span , TokenStream } ;
2
2
use quote:: quote;
3
3
use syn:: {
4
- punctuated:: Punctuated , spanned :: Spanned , token:: Comma , Attribute , DeriveInput , Field , Lit ,
5
- Meta , MetaNameValue , NestedMeta , Type , Variant ,
4
+ punctuated:: Punctuated , token:: Comma , Attribute , DeriveInput , Field , LitStr , Meta , Token , Type ,
5
+ Variant ,
6
6
} ;
7
7
8
8
macro_rules! assert_attribute {
@@ -77,82 +77,53 @@ pub fn parse_container_attributes(input: &[Attribute]) -> syn::Result<SqlxContai
77
77
let mut no_pg_array = None ;
78
78
let mut default = None ;
79
79
80
- for attr in input
81
- . iter ( )
82
- . filter ( |a| a. path . is_ident ( "sqlx" ) || a. path . is_ident ( "repr" ) )
83
- {
84
- let meta = attr
85
- . parse_meta ( )
86
- . map_err ( |e| syn:: Error :: new_spanned ( attr, e) ) ?;
87
- match meta {
88
- Meta :: List ( list) if list. path . is_ident ( "sqlx" ) => {
89
- for value in list. nested . iter ( ) {
90
- match value {
91
- NestedMeta :: Meta ( meta) => match meta {
92
- Meta :: Path ( p) if p. is_ident ( "transparent" ) => {
93
- try_set ! ( transparent, true , value)
94
- }
95
-
96
- Meta :: Path ( p) if p. is_ident ( "no_pg_array" ) => {
97
- try_set ! ( no_pg_array, true , value) ;
98
- }
99
-
100
- Meta :: NameValue ( MetaNameValue {
101
- path,
102
- lit : Lit :: Str ( val) ,
103
- ..
104
- } ) if path. is_ident ( "rename_all" ) => {
105
- let val = match & * val. value ( ) {
106
- "lowercase" => RenameAll :: LowerCase ,
107
- "snake_case" => RenameAll :: SnakeCase ,
108
- "UPPERCASE" => RenameAll :: UpperCase ,
109
- "SCREAMING_SNAKE_CASE" => RenameAll :: ScreamingSnakeCase ,
110
- "kebab-case" => RenameAll :: KebabCase ,
111
- "camelCase" => RenameAll :: CamelCase ,
112
- "PascalCase" => RenameAll :: PascalCase ,
113
- _ => fail ! ( meta, "unexpected value for rename_all" ) ,
114
- } ;
115
-
116
- try_set ! ( rename_all, val, value)
117
- }
118
-
119
- Meta :: NameValue ( MetaNameValue {
120
- path,
121
- lit : Lit :: Str ( val) ,
122
- ..
123
- } ) if path. is_ident ( "type_name" ) => {
124
- try_set ! (
125
- type_name,
126
- TypeName {
127
- val: val. value( ) ,
128
- span: value. span( ) ,
129
- } ,
130
- value
131
- )
132
- }
133
-
134
- Meta :: Path ( p) if p. is_ident ( "default" ) => {
135
- try_set ! ( default , true , value)
136
- }
137
-
138
- u => fail ! ( u, "unexpected attribute" ) ,
139
- } ,
140
- u => fail ! ( u, "unexpected attribute" ) ,
141
- }
142
- }
143
- }
144
- Meta :: List ( list) if list. path . is_ident ( "repr" ) => {
145
- if list. nested . len ( ) != 1 {
146
- fail ! ( & list. nested, "expected one value" )
147
- }
148
- match list. nested . first ( ) . unwrap ( ) {
149
- NestedMeta :: Meta ( Meta :: Path ( p) ) if p. get_ident ( ) . is_some ( ) => {
150
- try_set ! ( repr, p. get_ident( ) . unwrap( ) . clone( ) , list) ;
151
- }
152
- u => fail ! ( u, "unexpected value" ) ,
80
+ for attr in input {
81
+ if attr. path ( ) . is_ident ( "sqlx" ) {
82
+ attr. parse_nested_meta ( |meta| {
83
+ if meta. path . is_ident ( "transparent" ) {
84
+ try_set ! ( transparent, true , attr) ;
85
+ } else if meta. path . is_ident ( "no_pg_array" ) {
86
+ try_set ! ( no_pg_array, true , attr) ;
87
+ } else if meta. path . is_ident ( "default" ) {
88
+ try_set ! ( default , true , attr) ;
89
+ } else if meta. path . is_ident ( "rename_all" ) {
90
+ meta. input . parse :: < Token ! [ =] > ( ) ?;
91
+ let lit: LitStr = meta. input . parse ( ) ?;
92
+
93
+ let val = match lit. value ( ) . as_str ( ) {
94
+ "lowercase" => RenameAll :: LowerCase ,
95
+ "snake_case" => RenameAll :: SnakeCase ,
96
+ "UPPERCASE" => RenameAll :: UpperCase ,
97
+ "SCREAMING_SNAKE_CASE" => RenameAll :: ScreamingSnakeCase ,
98
+ "kebab-case" => RenameAll :: KebabCase ,
99
+ "camelCase" => RenameAll :: CamelCase ,
100
+ "PascalCase" => RenameAll :: PascalCase ,
101
+ _ => fail ! ( lit, "unexpected value for rename_all" ) ,
102
+ } ;
103
+
104
+ try_set ! ( rename_all, val, lit)
105
+ } else if meta. path . is_ident ( "type_name" ) {
106
+ meta. input . parse :: < Token ! [ =] > ( ) ?;
107
+ let lit: LitStr = meta. input . parse ( ) ?;
108
+ let name = TypeName {
109
+ val : lit. value ( ) ,
110
+ span : lit. span ( ) ,
111
+ } ;
112
+
113
+ try_set ! ( type_name, name, lit)
114
+ } else {
115
+ fail ! ( meta. path, "unexpected attribute" )
153
116
}
117
+
118
+ Ok ( ( ) )
119
+ } ) ?;
120
+ } else if attr. path ( ) . is_ident ( "repr" ) {
121
+ let list: Punctuated < Meta , Token ! [ , ] > =
122
+ attr. parse_args_with ( <Punctuated < Meta , Token ! [ , ] > >:: parse_terminated) ?;
123
+
124
+ if let Some ( path) = list. iter ( ) . find_map ( |f| f. require_path_only ( ) . ok ( ) ) {
125
+ try_set ! ( repr, path. get_ident( ) . unwrap( ) . clone( ) , list) ;
154
126
}
155
- _ => { }
156
127
}
157
128
}
158
129
@@ -174,35 +145,28 @@ pub fn parse_child_attributes(input: &[Attribute]) -> syn::Result<SqlxChildAttri
174
145
let mut skip: bool = false ;
175
146
let mut json = false ;
176
147
177
- for attr in input. iter ( ) . filter ( |a| a. path . is_ident ( "sqlx" ) ) {
178
- let meta = attr
179
- . parse_meta ( )
180
- . map_err ( |e| syn:: Error :: new_spanned ( attr, e) ) ?;
181
-
182
- if let Meta :: List ( list) = meta {
183
- for value in list. nested . iter ( ) {
184
- match value {
185
- NestedMeta :: Meta ( meta) => match meta {
186
- Meta :: NameValue ( MetaNameValue {
187
- path,
188
- lit : Lit :: Str ( val) ,
189
- ..
190
- } ) if path. is_ident ( "rename" ) => try_set ! ( rename, val. value( ) , value) ,
191
- Meta :: NameValue ( MetaNameValue {
192
- path,
193
- lit : Lit :: Str ( val) ,
194
- ..
195
- } ) if path. is_ident ( "try_from" ) => try_set ! ( try_from, val. parse( ) ?, value) ,
196
- Meta :: Path ( path) if path. is_ident ( "default" ) => default = true ,
197
- Meta :: Path ( path) if path. is_ident ( "flatten" ) => flatten = true ,
198
- Meta :: Path ( path) if path. is_ident ( "skip" ) => skip = true ,
199
- Meta :: Path ( path) if path. is_ident ( "json" ) => json = true ,
200
- u => fail ! ( u, "unexpected attribute" ) ,
201
- } ,
202
- u => fail ! ( u, "unexpected attribute" ) ,
203
- }
148
+ for attr in input. iter ( ) . filter ( |a| a. path ( ) . is_ident ( "sqlx" ) ) {
149
+ attr. parse_nested_meta ( |meta| {
150
+ if meta. path . is_ident ( "rename" ) {
151
+ meta. input . parse :: < Token ! [ =] > ( ) ?;
152
+ let val: LitStr = meta. input . parse ( ) ?;
153
+ try_set ! ( rename, val. value( ) , val) ;
154
+ } else if meta. path . is_ident ( "try_from" ) {
155
+ meta. input . parse :: < Token ! [ =] > ( ) ?;
156
+ let val: LitStr = meta. input . parse ( ) ?;
157
+ try_set ! ( try_from, val. parse( ) ?, val) ;
158
+ } else if meta. path . is_ident ( "default" ) {
159
+ default = true ;
160
+ } else if meta. path . is_ident ( "flatten" ) {
161
+ flatten = true ;
162
+ } else if meta. path . is_ident ( "skip" ) {
163
+ skip = true ;
164
+ } else if meta. path . is_ident ( "json" ) {
165
+ json = true ;
204
166
}
205
- }
167
+
168
+ return Ok ( ( ) ) ;
169
+ } ) ?;
206
170
207
171
if json && flatten {
208
172
fail ! (
0 commit comments