vise_macros/
utils.rs

1//! Utils shared among multiple derive macros.
2
3use syn::{Attribute, Generics};
4
5pub(crate) trait ParseAttribute: Sized {
6    fn parse(raw: &Attribute) -> syn::Result<Self>;
7}
8
9pub(crate) fn metrics_attribute<T>(raw_attrs: &[Attribute]) -> syn::Result<T>
10where
11    T: ParseAttribute + Default,
12{
13    let attrs = raw_attrs
14        .iter()
15        .find(|attr| attr.meta.path().is_ident("metrics"));
16    attrs.map_or_else(|| Ok(T::default()), T::parse)
17}
18
19pub(crate) fn ensure_no_generics(generics: &Generics, derived_macro: &str) -> syn::Result<()> {
20    if generics.params.is_empty() {
21        Ok(())
22    } else {
23        let message = format!("Generics are not supported for `derive({derived_macro})` macro");
24        Err(syn::Error::new_spanned(generics, message))
25    }
26}