better_default 1.0.5

The std Default derive, but it allows to constomize the default fields values and has some upgrades.
Documentation
use crate::TokenStream2;
use syn::{spanned::Spanned, Attribute};

fn find_attribute_and_duplicates<'a>(
    attrs: &'a [Attribute],
    ident: &str,
) -> Option<(&'a Attribute, Vec<&'a Attribute>)> {
    let mut iter = attrs
        .iter()
        .filter(|attr| attr.path().get_ident().is_some_and(|i| i == ident));

    let first = iter.next()?;

    let vec = iter.collect();

    Some((first, vec))
}

pub fn find_attribute_unique<'l>(
    attrs: &'l [Attribute],
    ident: &str,
    error_tokens: &mut Vec<TokenStream2>,
) -> Option<&'l syn::Attribute> {
    let (attr, duplicates) = find_attribute_and_duplicates(attrs, ident)?;

    for duplicate in duplicates {
        error!(
            error_tokens,
            duplicate.meta.span(),
            "this attribute is already declared."
        );
    }

    Some(attr)
}