@@ -5,12 +5,10 @@ use syn::{
55 bracketed, parenthesized,
66 parse:: { Parse , ParseStream } ,
77 spanned:: Spanned ,
8- Attribute , Data , DeriveInput , Token ,
8+ Attribute , Data , DeriveInput , Token , Path ,
99} ;
1010
1111pub fn parse_derive_input ( input : DeriveInput ) -> Result < Meta , syn:: Error > {
12- eprintln ! ( "{input:#?}" ) ;
13-
1412 let kinded_attrs: KindedAttributes = {
1513 match find_kinded_attr ( & input) ? {
1614 Some ( kinded_attr) => syn:: parse2 ( kinded_attr. to_token_stream ( ) ) ?,
@@ -89,19 +87,38 @@ impl Parse for KindedAttributes {
8987 parenthesized_content
9088 } ;
9189
92- let attr_name: Ident = input. parse ( ) ?;
93- if attr_name == "kind" {
94- let _: Token ! ( =) = input. parse ( ) ?;
95- let kind: Ident = input. parse ( ) ?;
96- if kinded_attrs. kind . is_none ( ) {
97- kinded_attrs. kind = Some ( kind) ;
90+
91+ while !input. is_empty ( ) {
92+ let attr_name: Ident = input. parse ( ) ?;
93+ if attr_name == "kind" {
94+ let _: Token ! ( =) = input. parse ( ) ?;
95+ let kind: Ident = input. parse ( ) ?;
96+ if kinded_attrs. kind . is_none ( ) {
97+ kinded_attrs. kind = Some ( kind) ;
98+ } else {
99+ let msg = format ! ( "Duplicated attribute: {attr_name}" ) ;
100+ return Err ( syn:: Error :: new ( attr_name. span ( ) , msg) ) ;
101+ }
102+ } else if attr_name == "derive" {
103+ let derive_input;
104+ parenthesized ! ( derive_input in input) ;
105+ let parsed_traits = derive_input. parse_terminated ( Path :: parse, Token ! [ , ] ) ?;
106+ let traits: Vec < Path > = parsed_traits. into_iter ( ) . collect ( ) ;
107+ if kinded_attrs. derive . is_none ( ) {
108+ kinded_attrs. derive = Some ( traits) ;
109+ } else {
110+ let msg = format ! ( "Duplicated attribute: {attr_name}" ) ;
111+ return Err ( syn:: Error :: new ( attr_name. span ( ) , msg) ) ;
112+ }
98113 } else {
99- let msg = format ! ( "Duplicated attribute: {attr_name}" ) ;
114+ let msg = format ! ( "Unknown attribute: {attr_name}" ) ;
100115 return Err ( syn:: Error :: new ( attr_name. span ( ) , msg) ) ;
101116 }
102- } else {
103- let msg = format ! ( "Unknown attribute: {attr_name}" ) ;
104- return Err ( syn:: Error :: new ( attr_name. span ( ) , msg) ) ;
117+
118+ // Parse `,` unless it's the end of the stream
119+ if !input. is_empty ( ) {
120+ let _comma: Token ! [ , ] = input. parse ( ) ?;
121+ }
105122 }
106123
107124 Ok ( kinded_attrs)
0 commit comments