mlx_macros/
util.rs

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}