1pub(crate) struct FilteredFields<'a> {
2 pub filtered: Vec<&'a syn::Field>,
3 pub other_fields: Vec<&'a syn::Field>,
4}
5
6pub(crate) fn filter_fields_with_attr<'a>(
7 fields: &'a syn::Fields,
8 attr_name: &str,
9) -> Result<FilteredFields<'a>, syn::Error> {
10 let mut filtered = Vec::new();
11 let mut other_fields = Vec::new();
12
13 match fields {
14 syn::Fields::Named(fields) => {
15 for field in &fields.named {
16 if field
17 .attrs
18 .iter()
19 .any(|attr| attr.path().is_ident(attr_name))
20 {
21 filtered.push(field);
22 } else {
23 other_fields.push(field);
24 }
25 }
26 }
27 syn::Fields::Unit => {}
28 syn::Fields::Unnamed(_) => {
29 return Err(syn::Error::new_spanned(
30 fields,
31 "Struct with unnamed fields is not supported".to_string(),
32 ))
33 }
34 }
35
36 Ok(FilteredFields {
37 filtered,
38 other_fields,
39 })
40}