educe/trait_handlers/eq/
mod.rs

1mod models;
2
3use models::TypeAttributeBuilder;
4use proc_macro2::TokenStream;
5use quote::quote;
6use syn::{DeriveInput, Generics, Meta};
7
8use super::TraitHandler;
9use crate::Trait;
10
11pub struct EqHandler;
12
13impl TraitHandler for EqHandler {
14    fn trait_meta_handler(
15        ast: &DeriveInput,
16        tokens: &mut TokenStream,
17        _traits: &[Trait],
18        meta: &Meta,
19    ) {
20        let type_attribute = TypeAttributeBuilder {
21            enable_bound: true
22        }
23        .from_eq_meta(meta);
24
25        let bound = type_attribute
26            .bound
27            .into_punctuated_where_predicates_by_generic_parameters(&ast.generics.params);
28
29        let ident = &ast.ident;
30
31        let mut generics_cloned: Generics = ast.generics.clone();
32
33        let where_clause = generics_cloned.make_where_clause();
34
35        for where_predicate in bound {
36            where_clause.predicates.push(where_predicate);
37        }
38
39        let (impl_generics, ty_generics, where_clause) = generics_cloned.split_for_impl();
40
41        let compare_impl = quote! {
42            impl #impl_generics core::cmp::Eq for #ident #ty_generics #where_clause {
43            }
44        };
45
46        tokens.extend(compare_impl);
47    }
48}