Crates.io | derive-elves |
lib.rs | derive-elves |
version | 0.1.2 |
source | src |
created_at | 2023-03-03 12:08:10.015189 |
updated_at | 2024-03-26 21:52:06.521531 |
description | Writing inclusive derive macros is tedious, this creates provides helper functions that make it easier. |
homepage | |
repository | https://github.com/michaelvanstraten/derive-elves |
max_upload_size | |
id | 799702 |
size | 23,951 |
Writing inclusive derive macros is tedious, this creates provides helper functions that make it easier.
The type_aware_impl
function makes it easy to write derive macros
that take the generics of the underlying type into consideration.
Considering this simple derive macro.
#[proc_macro_derive(Append)]
pub fn push(input_stream: TokenStream) -> TokenStream {
let input_type = parse_macro_input!(input_stream as DeriveInput);
let ident = &input_type.ident;
type_aware_impl(
quote! {
impl<T: Append<T>> Append<T> for #ident {
fn append(&self, l: T) {
todo!()
}
}
},
&input_type,
)
}
The the following anotated struct,
#[derive(Append)]
struct Foo<S: ToString> {
bar: S
}
would expand to this:
struct Foo<S: ToString> {
bar: S
}
impl<T: Append<T>, S: ToString> Append<T> for Foo<S> {
fn append(&self, l: T) {
todo!()
}
}
The above also works for more complex patterns, like the following:
impl Trait for & #ident
impl Trait for &mut #ident
impl Trait for [#ident]
impl Trait for (#ident, A, B, C)
License: MIT