1use 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}