Skip to content

Commit b77bf05

Browse files
committed
macros/parser: extract struct fields
Add a parser util function that extracts the fields from a struct.
1 parent 7b24caa commit b77bf05

File tree

1 file changed

+29
-1
lines changed

1 file changed

+29
-1
lines changed

scylla-macros/src/parser.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use syn::{Data, DeriveInput, ExprLit, Fields, FieldsNamed, Lit};
1+
use syn::{Data, DeriveInput, ExprLit, Fields, FieldsNamed, FieldsUnnamed, Lit};
22
use 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+
2654
pub(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

Comments
 (0)