educe/trait_handlers/copy/
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 CopyHandler;
12
13impl TraitHandler for CopyHandler {
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_copy_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 copy_impl = quote! {
42            impl #impl_generics core::marker::Copy for #ident #ty_generics #where_clause {
43            }
44        };
45
46        tokens.extend(copy_impl);
47    }
48}