@@ -5,8 +5,8 @@ use crate::{
55use proc_macro2:: { Ident , Span } ;
66use serde_derive_internals:: attr:: RenameRule ;
77use syn:: {
8- punctuated:: Punctuated , spanned:: Spanned as _, AngleBracketedGenericArguments , DataEnum , DataStruct , DataUnion , Fields ,
9- FieldsNamed , GenericArgument , LitStr , PathArguments , Type , TypePath
8+ punctuated:: Punctuated , spanned:: Spanned as _, AngleBracketedGenericArguments , DataEnum , DataStruct , DataUnion , Field ,
9+ Fields , FieldsNamed , GenericArgument , LitStr , Meta , PathArguments , Type , TypePath
1010} ;
1111use syn_path:: path;
1212
@@ -43,21 +43,25 @@ pub(super) enum ParseDataType {
4343 Unit
4444}
4545
46+ fn filter_parse_attrs ( attrs : & mut FieldAttributes , input : & Field , filter : & str , error_on_unknown : bool ) -> syn:: Result < ( ) > {
47+ for attr in & input. attrs {
48+ match & attr. meta {
49+ Meta :: List ( meta) if meta. path . is_ident ( filter) => {
50+ attrs. parse_from ( meta. tokens . clone ( ) , error_on_unknown) ?;
51+ } ,
52+ _ => { }
53+ }
54+ }
55+ Ok ( ( ) )
56+ }
57+
4658fn parse_named_fields ( named_fields : & FieldsNamed , rename_all : Option < & LitStr > ) -> syn:: Result < Vec < ParseDataField > > {
4759 let mut fields: Vec < ParseDataField > = Vec :: new ( ) ;
4860 for f in & named_fields. named {
4961 // parse #[serde] and #[openapi] attributes
5062 let mut attrs = FieldAttributes :: default ( ) ;
51- for attr in & f. attrs {
52- if attr. path . is_ident ( "serde" ) {
53- attrs. parse_from ( attr, false ) ?;
54- }
55- }
56- for attr in & f. attrs {
57- if attr. path . is_ident ( "openapi" ) {
58- attrs. parse_from ( attr, true ) ?;
59- }
60- }
63+ filter_parse_attrs ( & mut attrs, f, "serde" , false ) ?;
64+ filter_parse_attrs ( & mut attrs, f, "openapi" , true ) ?;
6165
6266 // skip this field if desired
6367 if attrs. skip_serializing && attrs. skip_deserializing {
@@ -67,7 +71,7 @@ fn parse_named_fields(named_fields: &FieldsNamed, rename_all: Option<&LitStr>) -
6771 // parse #[doc] attributes
6872 let mut doc = Vec :: new ( ) ;
6973 for attr in & f. attrs {
70- if attr. path . is_ident ( "doc" ) {
74+ if attr. path ( ) . is_ident ( "doc" ) {
7175 if let Some ( lit) = parse_doc_attr ( attr) ? {
7276 doc. push ( lit. value ( ) ) ;
7377 }
@@ -339,7 +343,7 @@ pub(super) fn parse_enum(ident: &Ident, inum: &DataEnum, attrs: &ContainerAttrib
339343 } ,
340344 // no variants
341345 ( None , None ) => Err ( syn:: Error :: new (
342- inum. brace_token . span ,
346+ inum. brace_token . span . span ( ) ,
343347 "#[derive(OpenapiType)] does not support enums with no variants"
344348 ) )
345349 }
0 commit comments