educe/trait_handlers/eq/
mod.rs1mod 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}