1- use syn:: { Data , DeriveInput , ExprLit , Fields , FieldsNamed , Lit } ;
1+ use syn:: { Data , DeriveInput , ExprLit , Fields , FieldsNamed , FieldsUnnamed , Lit } ;
22use syn:: { Expr , Meta } ;
33
44/// Parses a struct DeriveInput and returns named fields of this struct.
@@ -23,6 +23,34 @@ pub(crate) fn parse_named_fields<'a>(
2323 }
2424}
2525
26+ pub ( crate ) enum StructFields < ' a > {
27+ Named ( & ' a FieldsNamed ) ,
28+ Unnamed ( & ' a FieldsUnnamed ) ,
29+ }
30+
31+ /// Parses a struct DeriveInput and returns fields (both named and unnamed) of this struct.
32+ pub ( crate ) fn parse_struct_fields < ' a > (
33+ input : & ' a DeriveInput ,
34+ current_derive : & str ,
35+ ) -> Result < StructFields < ' a > , syn:: Error > {
36+ let create_err_msg = || {
37+ format ! (
38+ "derive({}) works only for structs with fields" ,
39+ current_derive
40+ )
41+ } ;
42+
43+ match & input. data {
44+ Data :: Struct ( data) => match & data. fields {
45+ Fields :: Named ( named_fields) => Ok ( StructFields :: Named ( named_fields) ) ,
46+ Fields :: Unnamed ( unnamed_fields) => Ok ( StructFields :: Unnamed ( unnamed_fields) ) ,
47+ Fields :: Unit => Err ( syn:: Error :: new_spanned ( data. struct_token , create_err_msg ( ) ) ) ,
48+ } ,
49+ Data :: Enum ( e) => Err ( syn:: Error :: new_spanned ( e. enum_token , create_err_msg ( ) ) ) ,
50+ Data :: Union ( u) => Err ( syn:: Error :: new_spanned ( u. union_token , create_err_msg ( ) ) ) ,
51+ }
52+ }
53+
2654pub ( crate ) fn get_path ( input : & DeriveInput ) -> Result < proc_macro2:: TokenStream , syn:: Error > {
2755 let mut this_path: Option < proc_macro2:: TokenStream > = None ;
2856 for attr in input. attrs . iter ( ) {
0 commit comments