1use derive_syn_parse::Parse;
2use proc_macro::TokenStream;
3use proc_macro_roids::DeriveInputExt;
4use quote::quote;
5use syn::{parse_macro_input, parse_quote, DeriveInput};
6
7mod kw {
8 syn::custom_keyword!(copy);
9}
10
11#[derive(Debug, Parse)]
12struct AliasOptions {
13 copy: Option<kw::copy>,
14}
15
16macro_rules! derive_alias {
17 ($name:ident => $($token:tt)*) => {
18 #[proc_macro_attribute]
19 pub fn $name(args: TokenStream, item: TokenStream) -> TokenStream {
20 let mut ast = parse_macro_input!(item as DeriveInput);
21 let args = parse_macro_input!(args as AliasOptions);
22
23 let mut derives = parse_quote!($($token)*);
24
25 if args.copy.is_some() {
26 derives = parse_quote!(#derives, Copy);
27 }
28
29 ast.append_derives(derives);
30
31 TokenStream::from(quote! { #ast })
32 }
33 };
34}
35
36derive_alias!(data => Debug, Clone);
37derive_alias!(key => Debug, Clone, Eq, PartialEq, Hash);
38derive_alias!(base => Debug);