34 lines
1.1 KiB
Rust
34 lines
1.1 KiB
Rust
use proc_macro::TokenStream;
|
|
use quote::quote;
|
|
|
|
/// Derive a set trait
|
|
///
|
|
/// # Args
|
|
///
|
|
/// - `input`: The [`syn::DeriveInput`] for the struct that we want to derive the set trait for
|
|
/// - `trait_path`: The [`syn::Path`] to the set trait
|
|
pub fn derive_set(input: syn::DeriveInput, trait_path: &syn::Path) -> TokenStream {
|
|
let ident = input.ident;
|
|
|
|
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
|
|
let mut where_clause = where_clause.cloned().unwrap_or_else(|| syn::WhereClause {
|
|
where_token: Default::default(),
|
|
predicates: Default::default(),
|
|
});
|
|
where_clause.predicates.push(
|
|
syn::parse2(quote! {
|
|
Self: 'static + Send + Sync + Clone + Eq + ::std::fmt::Debug + ::std::hash::Hash
|
|
})
|
|
.unwrap(),
|
|
);
|
|
|
|
(quote! {
|
|
impl #impl_generics #trait_path for #ident #ty_generics #where_clause {
|
|
fn dyn_clone(&self) -> std::boxed::Box<dyn #trait_path> {
|
|
std::boxed::Box::new(std::clone::Clone::clone(self))
|
|
}
|
|
}
|
|
})
|
|
.into()
|
|
}
|